CompanyDrawer.vue 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370
  1. <template>
  2. <div>
  3. <el-drawer
  4. ref="companyDrawerRef"
  5. class="test"
  6. :model-value="true"
  7. @close="() => emit('onClose')"
  8. with-header="true"
  9. size="35%"
  10. >
  11. <template #header="{ titleId }">
  12. <p :id="titleId">{{ title }}</p>
  13. </template>
  14. <el-form
  15. ref="ruleFormRef"
  16. :model="ruleForm"
  17. :rules="rules"
  18. label-width="90px"
  19. class="demo-ruleForm"
  20. size="default"
  21. status-icon
  22. >
  23. <el-form-item label="公司名称" prop="name">
  24. <el-input v-model="ruleForm.name" style="width: 200px" />
  25. </el-form-item>
  26. <el-form-item label="上级场景" prop="seniorScene">
  27. <el-input v-model="ruleForm.seniorScene" style="width: 200px" disabled />
  28. </el-form-item>
  29. <el-form-item label="公司代码" prop="code">
  30. <el-input v-model="ruleForm.code" style="width: 200px" />
  31. </el-form-item>
  32. <el-form-item label="标签&模板" required>
  33. <div style="display: flex; flex-direction: column; align-items: flex-start">
  34. <div
  35. v-for="(item, index) in ruleForm.selectItems"
  36. :key="index"
  37. style="margin-bottom: 16px; display: flex"
  38. >
  39. <el-select v-model="item.tag" placeholder="请选择标签" style="width: 126px">
  40. <el-option
  41. v-for="item1 in props.sceneList"
  42. :key="item1.id"
  43. :label="item1.name"
  44. :value="item1.id"
  45. />
  46. </el-select>
  47. <img
  48. src="@/assets/icons/link.png"
  49. alt=""
  50. style="width: 16px; margin-left: 2px; margin-right: 2px" />
  51. <el-select v-model="item.template" placeholder="请选择模板" style="width: 126px">
  52. <el-option
  53. v-for="item2 in props.templateList"
  54. :key="item2.id"
  55. :label="item2.name"
  56. :value="item2.id"
  57. />
  58. </el-select>
  59. <img
  60. src="@/assets/icons/close.png"
  61. @click="deleScene(index)"
  62. alt=""
  63. style="
  64. width: 13px;
  65. height: 13px;
  66. margin-top: 10px;
  67. margin-left: 3px;
  68. cursor: pointer;
  69. "
  70. /></div>
  71. <div style="width: 200px">
  72. <el-icon size="28px" @click="addChange" style="cursor: pointer"
  73. ><CirclePlus /></el-icon
  74. ></div>
  75. </div>
  76. </el-form-item>
  77. <el-form-item label="备注" prop="remark">
  78. <el-input v-model="ruleForm.remark" style="width: 200px" />
  79. </el-form-item>
  80. <el-form-item label="状态">
  81. <el-switch
  82. v-model="ruleForm.addEnable"
  83. :active-value="ENABLED.TRUE"
  84. :inactive-value="ENABLED.FALSE"
  85. class="switchUse"
  86. />
  87. </el-form-item>
  88. </el-form>
  89. <div style="position: absolute; left: 108px; bottom: 67px">
  90. <el-button v-if="!props.comEdit" @click="resetDrawCom">重置</el-button>
  91. <el-button type="primary" v-if="!props.comEdit" @click="newCompanyAdd"> 提交 </el-button>
  92. <el-button type="primary" v-if="props.comEdit" @click="editedSub(ruleFormRef)">
  93. 提交
  94. </el-button>
  95. </div>
  96. </el-drawer></div
  97. >
  98. </template>
  99. <script setup lang="ts">
  100. import { computed, reactive, ref, defineProps, defineEmits, watch } from 'vue';
  101. import {
  102. addCompanyModuleLabel,
  103. editCompanyModuleLabel,
  104. SceneLabelType,
  105. TemplateType,
  106. } from '@/api/scene/secene-templet';
  107. import { ENABLED } from './constant';
  108. import type { FormInstance, FormRules } from 'element-plus';
  109. import { ElMessage, ElMessageBox } from 'element-plus';
  110. import { CirclePlus } from '@element-plus/icons-vue';
  111. import { addCompany, editCompany } from '@/api/scene/sceneOperate';
  112. interface SelectItemType {
  113. tag: string;
  114. template: string;
  115. }
  116. const props = defineProps<{
  117. sceneList: SceneLabelType[];
  118. templateList: TemplateType[];
  119. allCodes: string[];
  120. comEdit: boolean;
  121. detail: {
  122. id?: number;
  123. name?: string;
  124. code?: string;
  125. seniorScene?: string;
  126. addEnable?: ENABLED;
  127. selectItems?: SelectItemType[];
  128. remark: string;
  129. };
  130. }>();
  131. const title = computed(() => {
  132. if (props.comEdit) {
  133. return '编辑公司';
  134. }
  135. return '添加公司';
  136. });
  137. const emit = defineEmits<{
  138. (e: 'onOk'): unknown;
  139. (e: 'onClose'): unknown;
  140. }>();
  141. //表格中的规则
  142. const ruleFormRef = ref<FormInstance>();
  143. interface RuleForm {
  144. name: string; //名称
  145. seniorScene: string; //上级场景
  146. code: string; //代码
  147. sceneCode: string; //场景代码
  148. tagCom?: string[]; //公司场景标签 可选多个
  149. templateCom?: string[]; //公司场景模板 可选多个
  150. tagWorkshop?: number; //场景标签 车间
  151. templateWorkshop?: number; //车间模板
  152. selectItems?: SelectItemType[];
  153. addEnable?: ENABLED;
  154. remark?: string; //备注,可用于添加经纬度,非必要
  155. }
  156. const ruleForm = reactive<RuleForm>({
  157. name: '',
  158. seniorScene: '顶级场景',
  159. code: '',
  160. sceneCode: '',
  161. tagCom: [],
  162. templateCom: [],
  163. tagWorkshop: undefined,
  164. templateWorkshop: undefined,
  165. selectItems: [{ tag: '', template: '' }],
  166. addEnable: ENABLED.TRUE,
  167. remark: '',
  168. });
  169. const rules = reactive<FormRules>({
  170. name: [
  171. { required: true, message: '公司名称不能为空', trigger: 'blur' },
  172. { min: 1, max: 100, message: '长度在1-100之间', trigger: 'blur' },
  173. ],
  174. code: [
  175. { required: true, message: '公司代码不能为空', trigger: 'blur' },
  176. { min: 1, max: 100, message: '长度在1-100之间', trigger: 'blur' },
  177. ],
  178. });
  179. //增加空的场景&模板
  180. const addChange = () => {
  181. ruleForm.selectItems!.push({
  182. tag: '',
  183. template: '',
  184. });
  185. };
  186. //编辑时需要传入子组件的数据
  187. watch(
  188. () => props.detail,
  189. (data) => {
  190. ruleForm.name = data.name!;
  191. ruleForm.code = data.code!;
  192. ruleForm.seniorScene = data.seniorScene!;
  193. ruleForm.addEnable = data.addEnable;
  194. ruleForm.selectItems = data.selectItems;
  195. ruleForm.remark = data.remark;
  196. },
  197. { immediate: true },
  198. );
  199. //删除场景&模板
  200. const deleScene = (index) => {
  201. if (ruleForm.selectItems!.length > 1) {
  202. ElMessageBox.confirm('请确认是否关闭该场景?', '状态关闭', {
  203. confirmButtonText: '确认',
  204. cancelButtonText: '取消',
  205. type: 'warning',
  206. })
  207. .then(() => {
  208. ruleForm.selectItems!.splice(index, 1);
  209. })
  210. .catch(() => {
  211. console.log('取消删除物件');
  212. });
  213. } else {
  214. ElMessage.warning({
  215. message: '无法删除',
  216. });
  217. }
  218. };
  219. //添加新公司的提交
  220. const newCompanyAdd = () => {
  221. if (!ruleFormRef.value) return;
  222. ruleFormRef.value.validate((valid) => {
  223. if (!valid) {
  224. return;
  225. }
  226. const selectTags = ruleForm.selectItems?.filter((item) => {
  227. return item.tag && item.template;
  228. });
  229. if (!selectTags?.[0]) {
  230. ElMessage({
  231. message: '请选择标签和模板',
  232. type: 'error',
  233. });
  234. return;
  235. }
  236. if (props.allCodes.indexOf(ruleForm.code) > -1) {
  237. ElMessageBox.confirm('场景代码重复,请重新填写', '代码重复', {
  238. confirmButtonText: '确认',
  239. cancelButtonText: '取消',
  240. type: 'error',
  241. })
  242. .then(() => {
  243. // ruleFormCom.code = '';
  244. console.log('场景代码重复,请重新填写');
  245. })
  246. .catch(() => {
  247. console.log('取消删除物件');
  248. });
  249. } else {
  250. const newComData = {
  251. name: ruleForm.name,
  252. code: ruleForm.code,
  253. status: Number(ruleForm.addEnable),
  254. isDeleted: 0,
  255. parentId: 0,
  256. serial: 0,
  257. remark: ruleForm.remark,
  258. };
  259. //提交数据并重置关闭el-draw
  260. addCompany(newComData)
  261. .then((res) => {
  262. //选出不为空字符串的数据
  263. ruleForm.selectItems = ruleForm.selectItems!.filter((item) => {
  264. return item.tag && item.template;
  265. });
  266. //将selectItems加工成保存公司-模板的数据类型
  267. const newModuleLabel = ruleForm.selectItems!.map((item) => {
  268. return {
  269. companyId: res,
  270. isDeleted: 0,
  271. sceneLabelId: Number(item.tag), //item.tag
  272. sceneModuleId: Number(item.template), ///item.template
  273. };
  274. });
  275. //保存公司-场景标签-场景模板关系
  276. return addCompanyModuleLabel(newModuleLabel);
  277. })
  278. .catch((err) => {
  279. console.log(err);
  280. })
  281. .finally(() => {
  282. emit('onOk');
  283. });
  284. }
  285. });
  286. };
  287. //编辑公司时的提交
  288. const editedSub = (formEl: FormInstance | undefined) => {
  289. if (!formEl) return;
  290. formEl.validate((valid) => {
  291. if (!valid) {
  292. return;
  293. }
  294. if (props.allCodes.indexOf(ruleForm.code) > -1) {
  295. if (props.detail.code !== ruleForm.code) {
  296. ElMessageBox.confirm('场景代码重复,请重新填写', '代码重复', {
  297. confirmButtonText: '确认',
  298. cancelButtonText: '取消',
  299. type: 'error',
  300. })
  301. .then(() => {
  302. console.log('代码重复');
  303. })
  304. .catch(() => {
  305. console.log('取消删除物件');
  306. });
  307. return;
  308. }
  309. }
  310. ruleForm.selectItems = ruleForm.selectItems!.filter((item) => {
  311. return item.tag && item.template;
  312. });
  313. //新增的数据
  314. const editNewCom = {
  315. id: props.detail.id,
  316. name: ruleForm.name,
  317. code: ruleForm.code,
  318. status: Number(ruleForm.addEnable),
  319. remark: ruleForm.remark,
  320. };
  321. // 编辑上传
  322. editCompany(editNewCom)
  323. .then(() => {
  324. //保存公司-场景标签-场景模板关系
  325. const editModuleLabel = ruleForm.selectItems!.map((item) => {
  326. return {
  327. companyId: props.detail.id,
  328. isDeleted: 0,
  329. sceneLabelId: Number(item.tag), //item.tag
  330. sceneModuleId: Number(item.template), ///item.template
  331. };
  332. });
  333. return editCompanyModuleLabel(editModuleLabel);
  334. })
  335. .finally(() => {
  336. emit('onOk');
  337. });
  338. });
  339. };
  340. //重置编辑框
  341. const resetDrawCom = () => {
  342. ruleForm.name = '';
  343. ruleForm.code = '';
  344. ruleForm.addEnable = ENABLED.TRUE;
  345. ruleForm.selectItems = [{ tag: '', template: '' }];
  346. };
  347. </script>
  348. <style scoped></style>