CompanyDrawer-shangfei.vue 13 KB

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