create-new-excel.vue 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484
  1. <template>
  2. <hc-dialog
  3. v-model="isShow"
  4. is-footer-center
  5. title="创建新的元素表"
  6. @close="dialogClose"
  7. @save="saveFormAndElementHandle"
  8. widths="56rem"
  9. :loading="submitLoading"
  10. >
  11. <el-form
  12. ref="formRef"
  13. :model="formModel"
  14. :rules="formRules"
  15. label-position="top"
  16. label-width="auto"
  17. >
  18. <el-row :gutter="60">
  19. <el-col :span="12">
  20. <el-form-item label="表名" prop="tableName">
  21. <el-input v-model="formModel.tableName" />
  22. </el-form-item>
  23. </el-col>
  24. <el-col :span="12">
  25. <el-form-item label="填报率">
  26. <el-input v-model="formModel.fillRate" />
  27. </el-form-item>
  28. </el-col>
  29. </el-row>
  30. <el-row :gutter="60">
  31. <el-col :span="12">
  32. <el-form-item label="表类型:" prop="tableType">
  33. <el-select
  34. v-model="formModel.tableType"
  35. placeholder="选择表类型"
  36. filterable
  37. block
  38. >
  39. <el-option
  40. v-for="item in tableTypelist"
  41. :key="item.value"
  42. :label="item.label"
  43. :value="item.value"
  44. />
  45. </el-select>
  46. </el-form-item>
  47. </el-col>
  48. <el-col :span="12">
  49. <el-form-item label="所属方:" prop="tableOwner">
  50. <el-select
  51. v-model="formModel.tableOwner"
  52. placeholder="选择所属方"
  53. filterable
  54. block
  55. >
  56. <el-option
  57. v-for="item in ownerTypeList"
  58. :key="item.value"
  59. :label="item.label"
  60. :value="item.value"
  61. />
  62. </el-select>
  63. </el-form-item>
  64. </el-col>
  65. </el-row>
  66. </el-form>
  67. <hc-card-item>
  68. <template #header>
  69. <el-tooltip
  70. :visible="editVisible"
  71. effect="light"
  72. placement="bottom-start"
  73. >
  74. <template #content>
  75. <div class="text-sm text-red">
  76. 1.元素名称不能为空<br />
  77. 2.数据类型不能为空<br />
  78. 3.元素长度不能为空<br />
  79. </div>
  80. </template>
  81. <el-button
  82. type="danger"
  83. @mouseenter="editVisible = true"
  84. @mouseleave="editVisible = false"
  85. >
  86. <HcIcon name="question" />
  87. <span>编辑说明</span>
  88. </el-button>
  89. </el-tooltip>
  90. </template>
  91. <template #extra>
  92. <el-button size="small" type="success" @click="addRowClick"
  93. >新增</el-button
  94. >
  95. <el-button size="small" type="primary" @click="uploadClick"
  96. >快捷导入</el-button
  97. >
  98. <el-button size="small" type="warning">下载导入模板</el-button>
  99. </template>
  100. <hc-table :column="tableColumn" :datas="editEleList">
  101. <template #eName="{ row }">
  102. <hc-table-input v-model="row.eName" />
  103. </template>
  104. <template #eType="{ row }">
  105. <el-select
  106. v-model="row.eType"
  107. @change="setDefaultLength(row)"
  108. placeholder="请选择"
  109. >
  110. <el-option
  111. v-for="item in dataTypeList"
  112. :key="item.id"
  113. :label="item.label"
  114. :value="item.value"
  115. ></el-option>
  116. </el-select>
  117. </template>
  118. <template #eLength="{ row }">
  119. <hc-table-input v-model="row.eLength" />
  120. </template>
  121. <template #eAllowDeviation="{ row }">
  122. <div class="flex">
  123. <el-select
  124. v-model="row.allow"
  125. :popper-append-to-body="false"
  126. placeholder="请选择"
  127. >
  128. <el-option :key="1" label="-" value="-"></el-option>
  129. <el-option :key="2" label=">" value=">"></el-option>
  130. <el-option :key="3" label="<" value="<"></el-option>
  131. <el-option :key="4" label="≥" value="≥"></el-option>
  132. <el-option :key="5" label="≤" value="≤"></el-option>
  133. <el-option :key="6" label="±" value="±"></el-option>
  134. <el-option
  135. :key="7"
  136. label="【】"
  137. value="【】"
  138. ></el-option>
  139. </el-select>
  140. <hc-table-input v-model="row.deviation" />
  141. </div>
  142. </template>
  143. <template #eInspectionMethod="{ row }">
  144. <hc-table-input v-model="row.eInspectionMethod" />
  145. </template>
  146. <template #action="{ row, index }">
  147. <el-link type="danger" @click="rowDelClick(row, index)"
  148. >删除</el-link
  149. >
  150. </template>
  151. </hc-table>
  152. </hc-card-item>
  153. </hc-dialog>
  154. <!-- 模板导入 -->
  155. <hc-dialog v-model="fileModal" title="模板导入" @save="saveFileImport">
  156. <hc-card-item>
  157. <template #header>
  158. <div class="text-sm text-red">
  159. 提示:必须按照系统要求的模版格式上传,否则系统识别无效
  160. </div>
  161. </template>
  162. <template #extra>
  163. <el-button
  164. size="small"
  165. type="primary"
  166. @click="downLoadFile"
  167. :loading="downloadLoading"
  168. >下载导入模板</el-button
  169. >
  170. <el-button
  171. size="small"
  172. type="primary"
  173. @click="importModalClick"
  174. :loading="uploadsLoading"
  175. >本地上传</el-button
  176. >
  177. </template>
  178. <hc-table :column="fileTableColumn" :datas="fileTableData">
  179. <template #elementAllowDeviation="{ row }">
  180. <div class="flex">
  181. <el-select
  182. v-model="row.allow"
  183. :popper-append-to-body="false"
  184. placeholder="请选择"
  185. >
  186. <el-option :key="1" label="-" value="-"></el-option>
  187. <el-option :key="2" label=">" value=">"></el-option>
  188. <el-option :key="3" label="<" value="<"></el-option>
  189. <el-option :key="4" label="≥" value="≥"></el-option>
  190. <el-option :key="5" label="≤" value="≤"></el-option>
  191. <el-option :key="6" label="±" value="±"></el-option>
  192. <el-option
  193. :key="7"
  194. label="【】"
  195. value="【】"
  196. ></el-option>
  197. </el-select>
  198. <hc-table-input v-model="row.elementAllowDeviation" />
  199. </div>
  200. </template>
  201. </hc-table>
  202. </hc-card-item>
  203. </hc-dialog>
  204. </template>
  205. <script setup>
  206. import { ref, watch } from "vue";
  207. import { getDictionaryData, getDictionaryName } from "~src/utils/tools";
  208. import mainApi from "~api/wbs/wbsforelement";
  209. import { useAppStore } from "~src/store";
  210. import { HcDelMsg, HcUploadFileApi } from "hc-vue3-ui";
  211. import {
  212. deepClone,
  213. formValidate,
  214. getArrValue,
  215. isNullES,
  216. getObjValue,
  217. downloadBlob,
  218. } from "js-fast-way";
  219. const store = useAppStore();
  220. const userInfo = ref(store.getUserInfo);
  221. const props = defineProps({
  222. ownerTypeList: {
  223. type: Array,
  224. default: () => [],
  225. },
  226. tableTypelist: {
  227. type: Array,
  228. default: () => [],
  229. },
  230. wid: {
  231. type: [String, Number],
  232. default: "",
  233. },
  234. node: {
  235. type: Object,
  236. default: () => {},
  237. },
  238. });
  239. //事件
  240. const emit = defineEmits(["close"]);
  241. //双向绑定
  242. // eslint-disable-next-line no-undef
  243. const isShow = defineModel("modelValue", {
  244. default: false,
  245. });
  246. //监听显示
  247. watch(isShow, (val) => {
  248. if (val) {
  249. getDataTypelist();
  250. } else {
  251. emit("close");
  252. }
  253. });
  254. const ownerTypeList = ref(props.ownerTypeList);
  255. const tableTypelist = ref(props.tableTypelist);
  256. const wbsId = ref(props.wid);
  257. const node = ref(props.node);
  258. //监听数据
  259. watch(
  260. () => [props.ownerTypeList, props.tableTypelist, props.wid, props.node],
  261. ([own, table, wbsid, nodeInfo]) => {
  262. ownerTypeList.value = own;
  263. tableTypelist.value = table;
  264. wbsId.value = wbsid;
  265. node.value = nodeInfo;
  266. },
  267. { deep: true }
  268. );
  269. //表单
  270. const formRef = ref(null);
  271. const formRules = {
  272. tableName: {
  273. required: true,
  274. trigger: "blur",
  275. message: "请输入表单名称",
  276. },
  277. tableType: {
  278. required: true,
  279. trigger: "blur",
  280. message: "请选择表单类型",
  281. },
  282. tableOwner: {
  283. required: true,
  284. trigger: "blur",
  285. message: "请选择所属方",
  286. },
  287. wid: {
  288. type: [String, Number],
  289. default: "",
  290. },
  291. };
  292. const curEleTable = ref({});
  293. const formModel = ref({});
  294. const editVisible = ref(false);
  295. const tableColumn = [
  296. { key: "eName", name: "元素名称", width: 150 },
  297. { key: "eType", name: "数据类型", width: 120 },
  298. { key: "eLength", name: "长度" },
  299. { key: "eAllowDeviation", name: "允许偏差值", width: 180 },
  300. { key: "eInspectionMethod", name: "检查方法和频率" },
  301. { key: "action", name: "操作", width: 80, align: "center" },
  302. ];
  303. const editEleList = ref([]);
  304. const dataTypeList = ref([]);
  305. const getDataTypelist = async () => {
  306. if (dataTypeList.value.length > 1) {
  307. return;
  308. }
  309. dataTypeList.value = await getDictionaryData("data_type", false);
  310. };
  311. const setDefaultLength = (row) => {
  312. const dataTypeDefaultMap = {
  313. 1: 250, //字符串
  314. 2: 50, //整数
  315. 3: 50, //小数
  316. 4: 50, //日期
  317. 5: 50, //数值
  318. 6: 50, //签名
  319. 7: 100, //文件
  320. };
  321. row.eLength = dataTypeDefaultMap[row.eType];
  322. };
  323. const rowDelClick = (row, index) => {
  324. editEleList.value.splice(index, 1);
  325. };
  326. const addRowClick = () => {
  327. editEleList.value.push({});
  328. };
  329. const submitLoading = ref(false);
  330. const editSubmitClick = async () => {
  331. const formRes = await formValidate(formRef.value);
  332. if (!formRes) return false;
  333. for (let i = 0; i < editEleList.value.length; i++) {
  334. if (!editEleList.value[i].id) {
  335. window.$message.warning("请先将新增的元素点击保存");
  336. return;
  337. }
  338. if (!editEleList.value[i].eName) {
  339. window.$message.warning("请填写第" + (i + 1) + "条元素名称");
  340. return;
  341. }
  342. if (!editEleList.value[i].eType) {
  343. window.$message.warning("请选择第" + (i + 1) + "条数据类型");
  344. return;
  345. }
  346. if (!editEleList[i].value.eLength) {
  347. window.$message.warning("请填写第" + (i + 1) + "条数据长度");
  348. return;
  349. }
  350. }
  351. if (editEleList.value.length > 0) {
  352. editEleList.value.forEach((element) => {
  353. element.eAllowDeviation =
  354. (element.allow ? element.allow : "") +
  355. (element.deviation ? element.deviation : "");
  356. });
  357. submitLoading.value = true;
  358. const { error, code } = await mainApi.updateBatchElements(
  359. editEleList.value,
  360. curEleTable.value.initTableName
  361. );
  362. submitLoading.value = false;
  363. if (!error && code === 200) {
  364. window?.$message?.success("操作成功");
  365. dialogClose();
  366. }
  367. } else {
  368. window.$message.warning("请填写完整元素表信息");
  369. }
  370. };
  371. const saveFormAndElementHandle = async () => {
  372. const formRes = await formValidate(formRef.value);
  373. if (!formRes) return false;
  374. formModel.value.wbsId = wbsId.value;
  375. formModel.value.tenantId = userInfo.value.tenant_id;
  376. formModel.value.nodeType = -1;
  377. formModel.value.type = 2; // '1'节点 '2'表
  378. formModel.value.parentId = node.value.id;
  379. formModel.value.nodeName = node.value.nodeName;
  380. for (let i = 0; i < editEleList.value.length; i++) {
  381. if (!editEleList.value[i].eName) {
  382. window.$message.warning("请填写第" + (i + 1) + "条元素名称");
  383. return;
  384. }
  385. if (!editEleList.value[i].eType) {
  386. window.$message.warning("请选择第" + (i + 1) + "条数据类型");
  387. return;
  388. }
  389. if (!editEleList.value[i].eLength) {
  390. window.$message.warning("请填写第" + (i + 1) + "条数据长度");
  391. return;
  392. }
  393. }
  394. if (editEleList.value.length > 0) {
  395. editEleList.value.forEach((element) => {
  396. element.eAllowDeviation =
  397. (element.allow ? element.allow : "") +
  398. (element.deviation ? element.deviation : "");
  399. });
  400. submitLoading.value = true;
  401. formModel.value.elementList = editEleList;
  402. const { error, code } = await mainApi.saveFormAndElement({
  403. ...formModel.value,
  404. });
  405. submitLoading.value = false;
  406. if (!error && code === 200) {
  407. window?.$message?.success("操作成功");
  408. dialogClose();
  409. }
  410. } else {
  411. window.$message.warning("请填写完整元素表信息");
  412. }
  413. };
  414. //关闭弹窗
  415. const dialogClose = () => {
  416. isShow.value = false;
  417. emit("close");
  418. };
  419. const fileModal = ref(false);
  420. const uploadClick = () => {
  421. fileModal.value = true;
  422. fileTableData.value = [];
  423. };
  424. const fileTableColumn = [
  425. { key: "elementName", name: "元素名称" },
  426. { key: "elementType", name: "数据类型" },
  427. { key: "elementLength", name: "长度" },
  428. { key: "elementAllowDeviation", name: "允许偏差值" },
  429. { key: "elementInspectionMethod", name: "检查方法和频率" },
  430. ];
  431. const fileTableData = ref([]);
  432. const downloadLoading = ref(false);
  433. const downLoadFile = async () => {
  434. downloadLoading.value = true;
  435. const { error, disposition, res } = await mainApi.getExportTem();
  436. //处理数据
  437. downloadLoading.value = false;
  438. if (!error) {
  439. if (disposition) {
  440. downloadBlob(res, disposition);
  441. } else {
  442. window.$message?.error("数据异常");
  443. }
  444. }
  445. };
  446. const uploadsLoading = ref(false);
  447. const importModalClick = () => {
  448. HcUploadFileApi({
  449. multiple: false,
  450. url: "/api/blade-manager/wbsFormElement/import-wbsElement",
  451. target: "/api/blade-manager/wbsFormElement/import-wbsElement",
  452. progress: () => {
  453. uploadsLoading.value = true;
  454. },
  455. success: (file, res) => {
  456. fileTableData.value = getArrValue(res.data);
  457. },
  458. error: (file) => {
  459. uploadsLoading.value = false;
  460. window.$message.error(`${file.name} 上传失败`);
  461. },
  462. finish: () => {
  463. uploadsLoading.value = false;
  464. window.$message.success("上传完成");
  465. },
  466. });
  467. };
  468. const saveFileImport = () => {
  469. fileModal.value = false;
  470. fileTableData.value.forEach((ele) => {
  471. editEleList.value.push({
  472. eName: ele.elementName,
  473. eAllowDeviation: ele.elementAllowDeviation,
  474. eName: ele.elementInspectionMethod,
  475. eLength: ele.elementLength,
  476. eType: ele.elementType,
  477. });
  478. });
  479. // editEleList.value
  480. };
  481. </script>