fault-page.vue 9.2 KB

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