fault-page.vue 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355
  1. <template>
  2. <div class="fault" v-if="faultDetails != null">
  3. <div class="title-fault">
  4. 产品名称:&nbsp;&nbsp;{{ faultDetails.materialName }}
  5. </div>
  6. <div class="title-fault">
  7. 产品编码:&nbsp;&nbsp;{{ faultDetails.materialCode }}
  8. </div>
  9. </div>
  10. <div class="mainContentBox">
  11. <avue-crud
  12. ref="crudRef"
  13. v-model:search="search"
  14. v-model="form"
  15. :data="data"
  16. :option="option"
  17. v-model:page="page"
  18. @row-save="createRow"
  19. @row-update="updateRow"
  20. @row-del="deleteRow"
  21. @search-change="searchChange"
  22. @search-reset="resetChange"
  23. @selection-change="selectionChange"
  24. >
  25. </avue-crud>
  26. </div>
  27. <div class="fault">
  28. <div class="image-title">图片</div>
  29. <div v-for="(image, index) in faultImg" :key="index" class="fault-image">
  30. <!-- 使用v-for循环渲染图片列表 -->
  31. <img
  32. :src="dictDataUtil.img_url + image.fileUrl"
  33. alt="图片"
  34. width="150px"
  35. class="fault-img"
  36. />
  37. </div>
  38. </div>
  39. <div class="fault" v-if="faultDetails != null">
  40. <div class="fault-detail" v-if="faultDetails.trackingNumber != null">
  41. 不合格审理单号 :&nbsp;&nbsp;{{ faultDetails.trackingNumber }}
  42. </div>
  43. <div class="fault-detail">序列号 :&nbsp;&nbsp;{{ faultDetails.seqNo }}</div>
  44. <div class="fault-detail">
  45. 故障描述 :&nbsp;&nbsp;{{ faultDetails.remark }}
  46. </div>
  47. <div class="fault-detail" v-if="faultDetails.opinion != null">
  48. 线长意见 :&nbsp;&nbsp;{{ faultDetails.opinion }}
  49. </div>
  50. <div class="title-fault" style="margin-top: 10px">
  51. 报故人:&nbsp;&nbsp;{{ faultDetails.creator }}
  52. </div>
  53. <div class="title-fault" style="margin-top: 10px">
  54. 报故工位:&nbsp;&nbsp;{{ faultDetails.stationName }}
  55. </div>
  56. <div class="title-fault" style="margin-top: 10px; margin-bottom: 10px">
  57. 报故数量:&nbsp;&nbsp;{{ faultDetails.unqualifiedNum }}
  58. </div>
  59. <div
  60. class="title-fault"
  61. style="margin-top: 10px; margin-bottom: 10px"
  62. v-if="faultDetails.result != undefined && faultDetails.result != null"
  63. >
  64. 处理结果:&nbsp;&nbsp;{{ faultDetails.result }}
  65. </div>
  66. </div>
  67. <div class="mainContentBox">
  68. <avue-crud ref="formRef" v-model="form" :data="data2" :option="option2">
  69. <template #isScrap="{ row, index, type }">
  70. <el-checkbox
  71. v-model="row.isScrap"
  72. label="报废"
  73. size="small"
  74. value="true"
  75. border
  76. @click="checkScrap(row)"
  77. />
  78. </template>
  79. <template #processInfo="{ row, index, type }">
  80. <el-select
  81. v-model="value[row.$index]"
  82. placeholder="请选择"
  83. @click="getFaults(row)"
  84. @change="listData(row)"
  85. :disabled="row.enabled"
  86. >
  87. <el-option
  88. v-for="item in optionFault[row.$index]"
  89. :key="item.value"
  90. :label="item.operationName"
  91. :value="item.id"
  92. >
  93. </el-option>
  94. </el-select>
  95. </template>
  96. </avue-crud>
  97. </div>
  98. <div style="overflow: hidden">
  99. <div class="detail-footer">
  100. <el-button type="primary" @click="onHandle"> 确定 </el-button>
  101. <el-button @click="cancelWindow">取消</el-button>
  102. </div>
  103. </div>
  104. </template>
  105. <script setup>
  106. import { ref, getCurrentInstance } from "vue";
  107. import { useCrud } from "@/hooks/userCrud";
  108. import ButtonPermKeys from "@/common/configs/buttonPermission";
  109. import { useCommonStoreHook, useDictionaryStore } from "@/store";
  110. const { isShowTable, tableType } = toRefs(useCommonStoreHook());
  111. import {
  112. getFault,
  113. getFaultDetails,
  114. getSeqNoList,
  115. getProcessInfoList,
  116. rework,
  117. } from "@/api/fault";
  118. import dictDataUtil from "@/common/configs/dictDataUtil";
  119. // 数据字典相关
  120. const { dicts } = useDictionaryStore();
  121. const test = () => {
  122. isShowTable.value = true;
  123. tableType.value = tableType.value == 1 ? 2 : 1;
  124. };
  125. const props = defineProps({
  126. faultId: {
  127. type: String,
  128. default: () => {
  129. return 0;
  130. },
  131. },
  132. dial: {
  133. type: Object,
  134. default: () => {
  135. return {};
  136. },
  137. },
  138. workOrderCode: {
  139. type: String,
  140. default: () => {
  141. return 0;
  142. },
  143. },
  144. });
  145. // 传入一个url,后面不带/
  146. const { form, data, option, search, page, toDeleteIds, Methords, Utils } =
  147. useCrud({
  148. src: "/api/v1/process/escalationDefects",
  149. });
  150. const {
  151. dataNoPageList,
  152. createRow,
  153. updateRow,
  154. deleteRow,
  155. searchChange,
  156. resetChange,
  157. } = Methords; //增删改查
  158. const { selectionChange, multipleDelete } = Methords; //选中和批量删除事件
  159. const { checkBtnPerm, downloadTemplate, exportData } = Utils; //按钮权限等工具
  160. // checkBtnPerm(ButtonPermKeys.PLAN.BTNS.order_add) :permission="permission"
  161. // const permission = reactive({
  162. // delBtn: checkPerm(buttonPermission.PLAN.BTNS.order_del),
  163. // addBtn: checkPerm(buttonPermission.PLAN.BTNS.order_add),
  164. // editBtn: checkPerm(buttonPermission.PLAN.BTNS.order_edit),
  165. // menu: true,
  166. // });
  167. const radio1 = ref("repair");
  168. const crudRef = ref(null); //crudRef.value 获取avue-crud对象
  169. const router = useRouter();
  170. const formRef = ref(null);
  171. const data2 = ref([]);
  172. const faultImg = ref(null);
  173. const formData = ref({});
  174. const formFault = ref({});
  175. const faultDetails = ref(null);
  176. const postDetail = ref([]);
  177. onMounted(() => {
  178. // console.log("crudRef", crudRef)
  179. search.value.escalationFaultId = props.faultId;
  180. dataNoPageList();
  181. formData.value.escalationFaultId = props.faultId;
  182. formFault.value.escalationFaultId = props.faultId;
  183. getFault(formData.value).then((data) => {
  184. faultImg.value = data.data;
  185. });
  186. getFaultDetails(props.faultId).then((data) => {
  187. faultDetails.value = data.data;
  188. for (let i = 0; i < dicts.disposal_measures_type.length; i++) {
  189. if (
  190. faultDetails.value.disposalMeasures ===
  191. dicts.disposal_measures_type[i].dictValue
  192. ) {
  193. faultDetails.value.disposalMeasures =
  194. dicts.disposal_measures_type[i].dictLabel;
  195. }
  196. }
  197. });
  198. getSeqNoList(formFault.value).then((data) => {
  199. data2.value = data.data;
  200. for (let i = 0; i < data2.value.length; i++) {
  201. data2.value[i].$cellEdit = true;
  202. }
  203. postDetail.value = Array.from(data2.value);
  204. });
  205. });
  206. const listData = (row) => {
  207. postDetail.value[row.$index].reworkProcessId = value.value[row.$index];
  208. postDetail.value[row.$index].workOrderCode = props.workOrderCode;
  209. for (let i = 0; i < optionFault.value[row.$index].length; i++) {
  210. if (value.value[row.$index] == optionFault.value[row.$index][i].id) {
  211. postDetail.value[row.$index].reworkOperationName =
  212. optionFault.value[row.$index][i].operationName;
  213. }
  214. }
  215. console.info(postDetail.value[row.$index]);
  216. };
  217. const faultHandle = ref({});
  218. const onHandle = () => {
  219. for (let i = 0; i < postDetail.value.length; i++) {
  220. if (!postDetail.value[i].isScrap) {
  221. if (undefined === postDetail.value[i].reworkProcessId) {
  222. ElMessage({
  223. message: postDetail.value[i].seqNo + "没选择返工工序",
  224. type: "error",
  225. });
  226. return;
  227. }
  228. }
  229. }
  230. faultHandle.value.reworkList = Array.from(postDetail.value);
  231. faultHandle.value.faultId = props.faultId;
  232. rework(faultHandle.value).then((data) => {
  233. if (data.code === "200") {
  234. ElMessage({
  235. message: data.msg,
  236. type: "success",
  237. });
  238. props.dial.visible = false;
  239. } else {
  240. ElMessage({
  241. message: data.msg,
  242. type: "error",
  243. });
  244. }
  245. });
  246. };
  247. // 设置表格列或者其他自定义的option
  248. option.value = Object.assign(option.value, {
  249. searchEnter: true,
  250. addBtn: false,
  251. editBtn: false,
  252. delBtn: false,
  253. viewBtn: false,
  254. menu: false,
  255. column: [
  256. {
  257. label: "缺陷大类",
  258. prop: "bugType",
  259. dicData: dicts.defect_mana,
  260. props: { label: "dictLabel", value: "dictValue" },
  261. },
  262. {
  263. label: "缺陷小类",
  264. prop: "bugName",
  265. },
  266. ],
  267. });
  268. const optionFault = ref([]);
  269. const processFault = ref({});
  270. const getFaults = (row) => {
  271. processFault.value.seqNo = row.seqNo;
  272. processFault.value.workOrderCode = props.workOrderCode;
  273. getProcessInfoList(processFault.value).then((data) => {
  274. optionFault.value[row.$index] = data.data;
  275. });
  276. };
  277. const checkScrap = (row) => {
  278. if (row.isScrap) {
  279. row.enabled = false;
  280. } else {
  281. row.enabled = true;
  282. }
  283. //row.reworkProcessId = undefined
  284. };
  285. const option2 = ref(null);
  286. const value = ref([]);
  287. // 设置表格列或者其他自定义的option
  288. option2.value = {
  289. addBtn: false,
  290. editBtn: false,
  291. delBtn: false,
  292. viewBtn: false,
  293. submitBtn: false,
  294. emptyBtn: false,
  295. menu: false,
  296. slot: true,
  297. column: [
  298. {
  299. label: "跟踪卡号",
  300. prop: "seqNo",
  301. },
  302. {
  303. label: "返工工序",
  304. prop: "processInfo",
  305. type: "select",
  306. },
  307. {
  308. label: "是否报废",
  309. prop: "isScrap",
  310. },
  311. ],
  312. };
  313. const cancelWindow = () => {
  314. props.dial.visible = false;
  315. };
  316. </script>
  317. <style>
  318. .title-fault {
  319. float: left;
  320. width: 300px;
  321. }
  322. .fault {
  323. margin-left: 15px;
  324. margin-top: 10px;
  325. display: block;
  326. overflow: hidden;
  327. }
  328. .fault-image {
  329. width: 150px;
  330. float: left;
  331. margin-left: 10px;
  332. overflow: hidden;
  333. }
  334. .image-title {
  335. margin-bottom: 15px;
  336. }
  337. .fault-img {
  338. display: inline-block;
  339. }
  340. .fault-detail {
  341. margin-top: 20px;
  342. }
  343. .detail-footer {
  344. float: right;
  345. overflow: hidden;
  346. }
  347. </style>