handle20.vue 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484
  1. <template>
  2. <el-drawer v-model="drawerVisible" size="1000" @close="handClose">
  3. <div>
  4. <DetailCom ref="detailComRef"></DetailCom>
  5. </div>
  6. <el-form
  7. ref="remarkRef"
  8. :model="remark"
  9. label-width="150"
  10. :rules="rules1"
  11. style="max-width: 800px; margin-left: 72px; margin-top: 20px"
  12. class="remark-form"
  13. >
  14. <div class="border">
  15. <el-form-item label="分析处置要求:" prop="content2">
  16. <el-input
  17. v-model="remark.content2"
  18. type="textarea"
  19. :autosize="{ minRows: 3, maxRows: 6 }"
  20. />
  21. </el-form-item>
  22. <el-form-item label="技术人员" prop="user1">
  23. <el-tree-select v-model="remark.user1" :data="userList" filterable clearable/>
  24. </el-form-item>
  25. <el-form-item label="联系电话" prop="phone">
  26. <el-input v-model="remark.phone"/>
  27. </el-form-item>
  28. <el-form-item label="责任部门" prop="user2">
  29. <el-tree-select v-model="remark.user2" :data="userList" filterable clearable/>
  30. </el-form-item>
  31. <el-form-item label="附件" prop="fileUrl">
  32. <FilesUpload
  33. v-model:src="remark.fileUrl"
  34. :generate-pdf="false"
  35. v-model:file-name-list="fileNameList"
  36. ref="load"
  37. />
  38. </el-form-item>
  39. </div>
  40. <div class="border">
  41. <el-form-item label="原因分析:" prop="content3">
  42. <el-input
  43. v-model="remark.content3"
  44. type="textarea"
  45. :autosize="{ minRows: 3, maxRows: 6 }"
  46. />
  47. </el-form-item>
  48. <el-form-item label="分析单位:" prop="company">
  49. <el-input v-model="remark.company"/>
  50. </el-form-item>
  51. <el-form-item label="附件" prop="fileUrl1">
  52. <FilesUpload
  53. v-model:src="remark.fileUrl1"
  54. :generate-pdf="false"
  55. v-model:file-name-list="fileNameList1"
  56. ref="load1"
  57. />
  58. </el-form-item>
  59. </div>
  60. <div class="border">
  61. <el-form-item label="采取的措施:" prop="content4">
  62. <el-input
  63. v-model="remark.content4"
  64. type="textarea"
  65. :autosize="{ minRows: 3, maxRows: 6 }"
  66. />
  67. </el-form-item>
  68. <el-form-item label="责任部门" prop="users">
  69. <!-- <el-tree-select-->
  70. <!-- v-model="remark.users"-->
  71. <!-- :data="userList"-->
  72. <!-- multiple-->
  73. <!-- filterable-->
  74. <!-- allow-create-->
  75. <!-- default-first-option-->
  76. <!-- placeholder="输入后按回车键可自定义输入"-->
  77. <!-- />-->
  78. <el-input v-model="remark.users"/>
  79. </el-form-item>
  80. <el-form-item label="附件" prop="fileUrl2">
  81. <FilesUpload
  82. v-model:src="remark.fileUrl2"
  83. :generate-pdf="false"
  84. v-model:file-name-list="fileNameList2"
  85. ref="load2"
  86. />
  87. </el-form-item>
  88. </div>
  89. <div class="border">
  90. <el-form-item label="措施落实:" prop="content5">
  91. <el-input
  92. v-model="remark.content5"
  93. type="textarea"
  94. :autosize="{ minRows: 3, maxRows: 6 }"
  95. />
  96. </el-form-item>
  97. <el-form-item label="责任部门" prop="user5">
  98. <!-- <el-tree-select-->
  99. <!-- v-model="remark.user5"-->
  100. <!-- :data="userList"-->
  101. <!-- filterable-->
  102. <!-- allow-create-->
  103. <!-- default-first-option-->
  104. <!-- placeholder="输入后按回车键可自定义输入"-->
  105. <!-- />-->
  106. <el-input v-model="remark.user5"/>
  107. </el-form-item>
  108. <el-form-item label="附件" prop="fileUrl3">
  109. <FilesUpload
  110. v-model:src="remark.fileUrl3"
  111. :generate-pdf="false"
  112. v-model:file-name-list="fileNameList3"
  113. ref="load3"
  114. />
  115. </el-form-item>
  116. </div>
  117. <el-form-item
  118. label="下一步处理人"
  119. prop="nextRemarkUser"
  120. v-if="remark.state == 0"
  121. >
  122. <el-tree-select
  123. v-model="remark.nextRemarkUser"
  124. :data="userList"
  125. filterable
  126. multiple
  127. />
  128. </el-form-item>
  129. <el-form-item label="是否通过" prop="state">
  130. <el-radio-group v-model="remark.state">
  131. <el-radio :value="0">同意</el-radio>
  132. <el-radio :value="1">不同意</el-radio>
  133. </el-radio-group>
  134. </el-form-item>
  135. </el-form>
  136. <template #footer>
  137. <div class="drawer-bottom">
  138. <el-button type="primary" @click="saveClick">暂存</el-button>
  139. <el-button type="info" @click="cancelClick">取消</el-button>
  140. <el-button type="primary" @click="confirmClick">提交</el-button>
  141. </div>
  142. </template>
  143. </el-drawer>
  144. </template>
  145. <script setup>
  146. import DetailCom from "@/views/unqualified/DetailCom.vue";
  147. import {dealFeedback, saveBack} from "@/api/unqualified/index";
  148. import {getUserTree} from "@/api/user/index";
  149. import {useUserStore} from "@/store";
  150. import FilesUpload from "@/components/Upload/FilesUpload.vue";
  151. import {ElMessage} from "element-plus";
  152. const drawerVisible = ref(false);
  153. const detailComRef = ref(null);
  154. const saleModel = ref({});
  155. const userStore = useUserStore();
  156. const dutyDept = ref("");
  157. const load = ref(null)
  158. const load1 = ref(null)
  159. const load2 = ref(null)
  160. const load3 = ref(null)
  161. const showDrawer = (row) => {
  162. console.log(row, "ioio")
  163. row.isEdit = '是';
  164. drawerVisible.value = true;
  165. saleModel.value = row;
  166. dutyDept.value = JSON.parse(row.remark2).user2;
  167. nextTick(() => {
  168. detailComRef.value && detailComRef.value.refreshView(row);
  169. if (row.remark2) {
  170. remark.content2 = JSON.parse(row.remark2).content ? JSON.parse(row.remark2).content : "";
  171. remark.user1 = JSON.parse(row.remark2).user1 ? JSON.parse(row.remark2).user1 : "";
  172. remark.user2 = JSON.parse(row.remark2).user2 ? JSON.parse(row.remark2).user2 : "";
  173. remark.phone = JSON.parse(row.remark2).phone ? JSON.parse(row.remark2).phone : "";
  174. remark.fileUrl = JSON.parse(row.remark2).fileUrl ? JSON.parse(row.remark2).fileUrl : "";
  175. fileNameList.value = JSON.parse(row.remark2).fileName ? [JSON.parse(row.remark2).fileName] : [];
  176. if (JSON.parse(row.remark2).fileName) {
  177. load.value?.setFileList([{name: JSON.parse(row.remark2).fileName}])
  178. }
  179. }
  180. if (row.remark3) {
  181. remark.content3 = JSON.parse(row.remark3).content ? JSON.parse(row.remark3).content : "";
  182. remark.company = JSON.parse(row.remark3).company ? JSON.parse(row.remark3).company : "";
  183. remark.fileUrl1 = JSON.parse(row.remark3).fileUrl ? JSON.parse(row.remark3).fileUrl : "";
  184. fileNameList1.value = JSON.parse(row.remark3).fileName ? [JSON.parse(row.remark3).fileName] : [];
  185. if (JSON.parse(row.remark3).fileName) {
  186. load1.value?.setFileList([{name: JSON.parse(row.remark3).fileName}])
  187. }
  188. }
  189. if (row.remark4) {
  190. remark.content4 = JSON.parse(row.remark4).content ? JSON.parse(row.remark4).content : "";
  191. remark.users = JSON.parse(row.remark4).users ? JSON.parse(row.remark4).users : "";
  192. remark.fileUrl2 = JSON.parse(row.remark4).fileUrl ? JSON.parse(row.remark4).fileUrl : "";
  193. fileNameList2.value = JSON.parse(row.remark4).fileName ? [JSON.parse(row.remark4).fileName] : [];
  194. if (JSON.parse(row.remark4).fileName) {
  195. load2.value?.setFileList([{name: JSON.parse(row.remark4).fileName}])
  196. }
  197. }
  198. if (row.remark5) {
  199. remark.content5 = JSON.parse(row.remark5).content ? JSON.parse(row.remark5).content : "";
  200. remark.user5 = JSON.parse(row.remark5).user ? JSON.parse(row.remark5).user : "";
  201. remark.fileUrl3 = JSON.parse(row.remark5).fileUrl ? JSON.parse(row.remark5).fileUrl : "";
  202. fileNameList3.value = JSON.parse(row.remark5).fileName ? [JSON.parse(row.remark5).fileName] : [];
  203. if (JSON.parse(row.remark5).fileName) {
  204. load3.value?.setFileList([{name: JSON.parse(row.remark5).fileName}])
  205. }
  206. }
  207. });
  208. getUserInfo();
  209. };
  210. const disabledDate = (time) => {
  211. //选择今天以及今天之后的日期
  212. return time.getTime() < Date.now() - 8.64e7; //如果没有后面的-8.64e7就是不可以选择
  213. //选择今天以及今天之前的日期
  214. //return time.getTime() > Date.now() - 8.64e7;//如果没有后面的-8.64e7就是不可以选择今天的
  215. };
  216. const rules1 = {
  217. content2: [
  218. {required: true, message: "请输入分析处置要求", trigger: "blur"},
  219. {min: 2, max: 200, message: "长度在 2 到 200 个字符", trigger: "blur"},
  220. ],
  221. content3: [
  222. {required: true, message: "请输入原因分析", trigger: "blur"},
  223. {min: 2, max: 200, message: "长度在 2 到 200 个字符", trigger: "blur"},
  224. ],
  225. content4: [
  226. {required: true, message: "请输入采取的措施", trigger: "blur"},
  227. {min: 2, max: 200, message: "长度在 2 到 200 个字符", trigger: "blur"},
  228. ],
  229. content5: [
  230. {required: true, message: "请输入措施落实", trigger: "blur"},
  231. {min: 2, max: 200, message: "长度在 2 到 200 个字符", trigger: "blur"},
  232. ],
  233. users: [{required: true, message: "请选择人员", trigger: "blur"}],
  234. user1: [{required: true, message: "请选择人员", trigger: "blur"}],
  235. user2: [{required: true, message: "请选择人员", trigger: "blur"}],
  236. user5: [{required: true, message: "请选择人员", trigger: "blur"}],
  237. phone: [
  238. {required: true, message: "请输入电话", trigger: "blur"},
  239. {min: 11, max: 11, message: "长度在11个字符", trigger: "blur"},
  240. ],
  241. company: [{required: true, message: "请输入责任部门", trigger: "change"}],
  242. nextRemarkUser: [
  243. {required: true, message: "请选择处理人", trigger: "blur"},
  244. ],
  245. };
  246. defineExpose({showDrawer});
  247. const remarkRef = ref(null);
  248. const remark = reactive({
  249. content: "",
  250. user: "",
  251. time: "",
  252. nextRemarkUser: "",
  253. state: 0,
  254. users: "",
  255. user5: "",
  256. fileUrl: "",
  257. fileUrl1: "",
  258. fileUrl2: "",
  259. fileUrl3: "",
  260. });
  261. const fileNameList = ref([]);
  262. const fileNameList1 = ref([]);
  263. const fileNameList2 = ref([]);
  264. const fileNameList3 = ref([]);
  265. const cancelClick = () => {
  266. drawerVisible.value = false;
  267. };
  268. const feedBackEmit = defineEmits(["finish"]);
  269. // 用户信息
  270. const userInfo = ref({});
  271. const userList = ref([]);
  272. const getUserInfo = async () => {
  273. getUserTree().then((data) => {
  274. userList.value = data.data;
  275. });
  276. };
  277. const confirmClick = () => {
  278. const date = new Date();
  279. const now = date.getFullYear() + "年" + (date.getMonth() + 1) + "月" + date.getDate() + "日";
  280. remark.user = userStore.user.username;
  281. remark.nextRemarkUser = remark.nextRemarkUser.join(",")
  282. remarkRef.value.validate((valid) => {
  283. if (valid) {
  284. // let remark1 = {
  285. // content: JSON.parse(saleModel.value.remark1).content,
  286. // user: JSON.parse(saleModel.value.remark1).user,
  287. // user1: dutyDept.value,
  288. // time: now,
  289. // };
  290. let remark2Copy = {
  291. content: remark.content2,
  292. user: remark.user,
  293. time: now,
  294. user1: remark.user1,
  295. user2: remark.user2,
  296. phone: remark.phone,
  297. state: remark.state,
  298. fileUrl: remark.fileUrl,
  299. fileName: fileNameList.value?.length > 0 ? fileNameList.value[0] : "",
  300. };
  301. let remark3 = {
  302. content: remark.content3,
  303. company: remark.company,
  304. time: now,
  305. fileUrl: remark.fileUrl1,
  306. fileName: fileNameList1.value?.length > 0 ? fileNameList1.value[0] : "",
  307. };
  308. let remark4 = {
  309. content: remark.content4,
  310. users: Array.isArray(remark.users)
  311. ? remark.users.join(",")
  312. : remark.users,
  313. time: now,
  314. fileUrl: remark.fileUrl2,
  315. fileName: fileNameList2.value?.length > 0 ? fileNameList2.value[0] : "",
  316. };
  317. let remark5 = {
  318. content: remark.content5,
  319. user: remark.user5,
  320. time: now,
  321. fileUrl: remark.fileUrl3,
  322. fileName: fileNameList3.value?.length > 0 ? fileNameList3.value[0] : "",
  323. };
  324. let remark6 = {
  325. content: "",
  326. user: remark.nextRemarkUser,
  327. };
  328. let p = {
  329. id: saleModel.value.id,
  330. // remark1: JSON.stringify(remark1),
  331. remark2: JSON.stringify(remark2Copy),
  332. remark3: JSON.stringify(remark3),
  333. remark4: JSON.stringify(remark4),
  334. remark5: JSON.stringify(remark5),
  335. currentUserName: remark.nextRemarkUser,
  336. remark6: JSON.stringify(remark6),
  337. state: remark.state,
  338. step: 1, //步骤 1 投书或建议处置意见 2 整改及纠正措施验证 3 处置情况的反馈意见
  339. };
  340. dealFeedback(p).then(() => {
  341. feedBackEmit("finish");
  342. cancelClick();
  343. });
  344. } else {
  345. return false;
  346. }
  347. });
  348. };
  349. const handClose = () => {
  350. load.value?.setFileList([])
  351. load1.value?.setFileList([])
  352. load2.value?.setFileList([])
  353. load3.value?.setFileList([])
  354. fileNameList.value = [];
  355. fileNameList1.value = [];
  356. fileNameList2.value = [];
  357. fileNameList3.value = [];
  358. remarkRef.value.resetFields();
  359. feedBackEmit("finish");
  360. }
  361. const saveClick = () => {
  362. const date = new Date();
  363. const now = date.getFullYear() + "年" + (date.getMonth() + 1) + "月" + date.getDate() + "日";
  364. remark.user = userStore.user.username;
  365. // remarkRef.value.validate((valid) => {
  366. remark.nextRemarkUser = Array.isArray(remark.nextRemarkUser)
  367. ? remark.nextRemarkUser.join(",")
  368. : "";
  369. // if (valid) {
  370. let remark2Copy = ""
  371. if (remark.content2 || remark.user1 || remark.user2 || remark.phone || remark.fileUrl || fileNameList.value?.length > 0) {
  372. remark2Copy = {
  373. content: remark.content2,
  374. user: remark.user,
  375. time: now,
  376. user1: remark.user1,
  377. user2: remark.user2,
  378. phone: remark.phone,
  379. state: remark.state,
  380. fileUrl: remark.fileUrl,
  381. fileName: fileNameList.value?.length > 0 ? fileNameList.value[0] : "",
  382. isSave: true,
  383. };
  384. }
  385. let remark3 = ""
  386. if (remark.content3 || remark.company || remark.fileUrl1 || fileNameList1.value?.length > 0) {
  387. remark3 = {
  388. content: remark.content3,
  389. company: remark.company,
  390. time: now,
  391. fileUrl: remark.fileUrl1,
  392. fileName: fileNameList1.value?.length > 0 ? fileNameList1.value[0] : "",
  393. };
  394. }
  395. let remark4 = ""
  396. if (remark.content4 || remark.users || remark.fileUrl2 || fileNameList2.value?.length > 0) {
  397. remark4 = {
  398. content: remark.content4,
  399. users: Array.isArray(remark.users)
  400. ? remark.users.join(",")
  401. : remark.users,
  402. time: now,
  403. fileUrl: remark.fileUrl2,
  404. fileName: fileNameList2.value?.length > 0 ? fileNameList2.value[0] : "",
  405. };
  406. }
  407. let remark5 = ""
  408. if (remark.content5 || remark.user5 || remark.fileUrl3 || fileNameList3.value?.length > 0) {
  409. remark5 = {
  410. content: remark.content5,
  411. user: remark.user5,
  412. time: now,
  413. fileUrl: remark.fileUrl3,
  414. fileName: fileNameList3.value?.length > 0 ? fileNameList3.value[0] : "",
  415. };
  416. }
  417. let remark6 = ""
  418. if (remark.nextRemarkUser) {
  419. remark6 = {
  420. content: "",
  421. user: remark.nextRemarkUser,
  422. };
  423. }
  424. let p = {
  425. id: saleModel.value.id,
  426. // remark1: JSON.stringify(remark1),
  427. remark2: remark2Copy ? JSON.stringify(remark2Copy) : "",
  428. remark3: remark3 ? JSON.stringify(remark3) : "",
  429. remark4: remark4 ? JSON.stringify(remark4) : "",
  430. remark5: remark5 ? JSON.stringify(remark5) : "",
  431. currentUserName: remark.nextRemarkUser,
  432. remark6: remark6 ? JSON.stringify(remark6) : "",
  433. state: remark.state,
  434. step: 1, //步骤 1 投书或建议处置意见 2 整改及纠正措施验证 3 处置情况的反馈意见
  435. };
  436. saveBack(p).then((res) => {
  437. if (res.data) {
  438. feedBackEmit("finish");
  439. ElMessage.success("保存成功");
  440. }
  441. });
  442. // } else {
  443. // return false;
  444. // }
  445. // });
  446. };
  447. </script>
  448. <style scoped lang="scss">
  449. @media print {
  450. #print {
  451. position: absolute; /* 或 absolute, fixed, 根据需要调整 */
  452. top: 20px; /* 调整顶部位置 */
  453. margin: 0; /* 重置边距 */
  454. width: 1000px;
  455. }
  456. }
  457. .border {
  458. border: 1px solid #000000;
  459. padding: 20px;
  460. margin-bottom: 20px;
  461. font-weight: 500;
  462. }
  463. </style>