CompanyDrawer.vue 13 KB

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