editModal.vue 56 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778
  1. <template>
  2. <ele-modal
  3. :title="title"
  4. :visible.sync="visible"
  5. :close-on-click-modal="false"
  6. @close="handleClose"
  7. resizable
  8. maxable
  9. width="80%"
  10. >
  11. <div v-loading="loading">
  12. <div
  13. class="switch"
  14. v-if="details && details.processInstanceId"
  15. :maxable="true"
  16. style="margin-bottom: 20px"
  17. >
  18. <div class="switch_left">
  19. <ul>
  20. <li
  21. v-for="item in tabOptions"
  22. :key="item.key"
  23. :class="{ active: activeComp == item.key }"
  24. @click="activeComp = item.key"
  25. >
  26. {{ item.name }}
  27. </li>
  28. </ul>
  29. </div>
  30. </div>
  31. <el-form
  32. v-if="activeComp == 'main'"
  33. ref="formRef"
  34. :model="form"
  35. :rules="rules"
  36. label-width="130px"
  37. :disabled="type == 'detail'"
  38. >
  39. <header-title title="事项信息"></header-title>
  40. <el-row style="margin-bottom: 20px">
  41. <el-col :span="8">
  42. <el-form-item label="记录编码">
  43. <el-input
  44. v-model="form.code"
  45. placeholder="系统自动生成"
  46. disabled
  47. ></el-input>
  48. </el-form-item>
  49. </el-col>
  50. <el-col :span="8">
  51. <el-form-item label="类型" required prop="itemType">
  52. <DictSelection
  53. dictName="记录规则事项类型"
  54. v-model="form.itemType"
  55. @change="itemTypeChange"
  56. >
  57. </DictSelection>
  58. </el-form-item>
  59. </el-col>
  60. <el-col :span="8">
  61. <el-form-item label="配置执行方式" required prop="executeMethod">
  62. <DictSelection
  63. dictName="记录规则执行方式"
  64. v-model="form.executeMethod"
  65. disabled
  66. >
  67. </DictSelection>
  68. </el-form-item>
  69. </el-col>
  70. </el-row>
  71. <el-row>
  72. <el-col :span="8">
  73. <el-form-item
  74. v-if="form.itemType == '1'"
  75. label="选择设备"
  76. required
  77. prop="deviceName"
  78. >
  79. <div class="mask-box" @click="selectDeviceId">
  80. <el-input
  81. v-model="form.deviceName"
  82. placeholder="请选择设备"
  83. size="small"
  84. :readonly="true"
  85. >
  86. <template #append>
  87. <el-button size="small">选择设备</el-button>
  88. </template>
  89. </el-input>
  90. </div>
  91. </el-form-item>
  92. </el-col>
  93. <el-col v-if="form.itemType == '3'" :span="8">
  94. <el-form-item label="关联任务">
  95. <el-input
  96. v-model="form.itemTaskName"
  97. placeholder="请输入任务名称"
  98. ></el-input>
  99. </el-form-item>
  100. </el-col>
  101. <el-col v-if="form.itemType == '2'" :span="8">
  102. <el-form-item label="关联记录规则" required prop="ruleName">
  103. <div class="mask-box" @click="selectReleaseId">
  104. <el-input
  105. v-model="form.ruleName"
  106. placeholder="请选择记录规则名称"
  107. size="small"
  108. readonly
  109. >
  110. <template #append>
  111. <el-button size="small">选择规则</el-button>
  112. </template>
  113. </el-input>
  114. </div>
  115. </el-form-item>
  116. </el-col>
  117. <el-col v-if="form.itemType == '2'" :span="8">
  118. <el-form-item label="记录规则分类">
  119. <DictSelection
  120. dictName="记录规则类型"
  121. v-model="form.recordRulesClassify"
  122. disabled
  123. >
  124. </DictSelection>
  125. </el-form-item>
  126. </el-col>
  127. <el-col v-if="form.itemType == '1'" :span="8">
  128. <el-form-item label="关联事项规则" required prop="ruleName">
  129. <div class="mask-box" @click="selectRulesId">
  130. <el-input
  131. v-model="form.ruleName"
  132. placeholder="请选择设备有关计划规则,如保养规则,巡点检规则等"
  133. size="small"
  134. readonly
  135. >
  136. <template #append>
  137. <el-button size="small">选择规则</el-button>
  138. </template>
  139. </el-input>
  140. </div>
  141. </el-form-item></el-col
  142. >
  143. </el-row>
  144. <header-title
  145. title="基本信息"
  146. v-if="form.itemType == 2"
  147. style="margin-top: 20px"
  148. ></header-title>
  149. <template v-if="form.itemType == 2">
  150. <el-row style="margin-bottom: 20px">
  151. <el-col :span="8">
  152. <el-form-item
  153. v-if="form.recordRulesClassify == 3"
  154. label="关联设备"
  155. >
  156. <el-input
  157. v-model="form.deviceName"
  158. placeholder="自动带出"
  159. disabled
  160. ></el-input>
  161. </el-form-item>
  162. <el-form-item v-else label="车间区域">
  163. <el-select
  164. v-model="form.workshopAreaId"
  165. placeholder="请选择车间区域"
  166. filterable
  167. clearable
  168. style="width: 100%"
  169. @change="workshopAreaIdChange"
  170. >
  171. <el-option
  172. v-for="item in workshopAreaList"
  173. :key="item.id"
  174. :label="item.name"
  175. :value="item.id"
  176. />
  177. </el-select>
  178. </el-form-item>
  179. </el-col>
  180. <el-col :span="8">
  181. <el-form-item label="检查开始时间" required prop="checkStartTime">
  182. <el-date-picker
  183. v-model="form.checkStartTime"
  184. type="datetime"
  185. format="yyyy-MM-dd HH:mm:ss"
  186. value-format="yyyy-MM-dd HH:mm:ss"
  187. placeholder="选择日期"
  188. style="width: 100%"
  189. @change="computedDuration"
  190. >
  191. </el-date-picker>
  192. </el-form-item>
  193. </el-col>
  194. <el-col :span="8">
  195. <el-form-item
  196. label="检查结束时间"
  197. required
  198. prop="checkFinishTime"
  199. >
  200. <el-date-picker
  201. v-model="form.checkFinishTime"
  202. type="datetime"
  203. format="yyyy-MM-dd HH:mm:ss"
  204. value-format="yyyy-MM-dd HH:mm:ss"
  205. placeholder="选择日期"
  206. style="width: 100%"
  207. @change="computedDuration"
  208. >
  209. </el-date-picker>
  210. </el-form-item>
  211. </el-col>
  212. </el-row>
  213. <el-row style="margin-bottom: 20px">
  214. <el-col :span="8">
  215. <el-form-item label="执行人" required prop="teamId">
  216. <el-select
  217. v-model="form.teamId"
  218. placeholder="请选择班组"
  219. filterable
  220. style="width: 120px"
  221. @change="checkTeamList(form.teamId)"
  222. >
  223. <el-option
  224. v-for="item in teamList"
  225. :label="item.name"
  226. :value="item.id"
  227. :key="item.id"
  228. >
  229. </el-option>
  230. </el-select>
  231. <el-select
  232. v-model="form.executeUsersIds"
  233. placeholder="请选择执行人"
  234. filterable
  235. multiple
  236. @change="changeId"
  237. style="max-width: 100%"
  238. >
  239. <div class="checkboxWrapper">
  240. <el-checkbox v-model="checked" @change="checkChange">
  241. 全选
  242. </el-checkbox>
  243. </div>
  244. <el-option
  245. v-for="item in teamUserList"
  246. :label="item.name"
  247. :value="item.id"
  248. :key="item.id"
  249. >
  250. </el-option>
  251. </el-select>
  252. </el-form-item>
  253. </el-col>
  254. <el-col :span="8">
  255. <el-form-item label="工时" required prop="duration">
  256. <el-input
  257. placeholder="请输入"
  258. v-model="form.duration"
  259. type="number"
  260. min="0"
  261. step="0.1"
  262. @change="durationChagne"
  263. >
  264. <template slot="append">
  265. <div style="width: 40px; box-sizing: border-box">小时</div>
  266. </template>
  267. </el-input>
  268. </el-form-item>
  269. </el-col>
  270. <el-col :span="8">
  271. <el-form-item label="检查有效期">
  272. <el-input
  273. placeholder="请输入"
  274. v-model="form.checkValidity"
  275. type="text"
  276. >
  277. <template slot="append">
  278. <div style="width: 40px; box-sizing: border-box">
  279. <el-form-item
  280. class="checkValidityUnit"
  281. style="margin-bottom: 0"
  282. >
  283. <DictSelection
  284. dictName="检查有效期单位"
  285. clearable
  286. v-model="form.checkValidityUnit"
  287. placeholder="单位"
  288. style="width: auto"
  289. >
  290. </DictSelection>
  291. </el-form-item>
  292. </div>
  293. </template>
  294. </el-input>
  295. </el-form-item>
  296. </el-col>
  297. </el-row>
  298. <el-row style="margin-bottom: 20px">
  299. <el-col v-if="form.recordRulesExecuteMethodName" :span="8">
  300. <el-form-item label="执行方式">
  301. <el-input
  302. v-model="form.recordRulesExecuteMethodName"
  303. placeholder="自动带出"
  304. disabled
  305. ></el-input>
  306. </el-form-item>
  307. </el-col>
  308. <el-col :span="8">
  309. <el-form-item label="产出物">
  310. <el-select
  311. v-model="form.outputType"
  312. placeholder="请选择产出物类型"
  313. filterable
  314. style="width: 100%"
  315. >
  316. <el-option
  317. v-for="item in outputTypeList"
  318. :key="item.value"
  319. :label="item.label"
  320. :value="item.value"
  321. />
  322. </el-select>
  323. </el-form-item>
  324. </el-col>
  325. <el-col :span="8">
  326. <el-form-item label="结论" required prop="conclusion">
  327. <el-radio-group v-model="form.conclusion">
  328. <el-radio :label="1">合格</el-radio>
  329. <el-radio :label="2">不合格</el-radio>
  330. </el-radio-group>
  331. </el-form-item>
  332. </el-col>
  333. </el-row>
  334. </template>
  335. <header-title title="关联产品" style="margin-top: 20px"></header-title>
  336. <el-row style="margin-bottom: 20px">
  337. <el-col :span="8">
  338. <el-form-item label="生产工单号" prop="workOrderCode">
  339. <el-select
  340. v-model="form.workOrderCode"
  341. placeholder="请选择生产工单"
  342. style="width: 100%"
  343. filterable
  344. remote
  345. clearable
  346. :remote-method="getWorkOrderList"
  347. @change="workOrderCodeChange"
  348. >
  349. <el-option
  350. v-for="item in workOrderList"
  351. :key="item.id"
  352. :label="item.code"
  353. :value="item.code"
  354. >
  355. </el-option>
  356. </el-select>
  357. </el-form-item>
  358. </el-col>
  359. <el-col :span="8">
  360. <el-form-item label="工序名称" prop="produceTaskId">
  361. <el-select
  362. v-model="form.produceTaskId"
  363. placeholder="请选择工序"
  364. style="width: 100%"
  365. @change="produceTaskIdChange"
  366. >
  367. <el-option
  368. v-for="item in produceTaskList"
  369. :key="item.taskId"
  370. :label="item.taskTypeName"
  371. :value="item.sourceTaskId"
  372. >
  373. </el-option>
  374. </el-select>
  375. </el-form-item>
  376. </el-col>
  377. <el-col :span="8">
  378. <el-form-item label="牌号">
  379. <el-input
  380. v-model="form.brandNo"
  381. placeholder="请输入牌号"
  382. ></el-input>
  383. </el-form-item>
  384. </el-col>
  385. </el-row>
  386. <el-row style="margin-bottom: 20px">
  387. <el-col :span="8">
  388. <el-form-item
  389. label="产品编码"
  390. :required="form.recordRulesClassify != '4'"
  391. :prop="form.recordRulesClassify != '4' ? 'productCode' : ''"
  392. >
  393. <el-input
  394. v-model="form.productCode"
  395. placeholder="请选择产品信息"
  396. @click.native="openProductDialog"
  397. readonly
  398. >
  399. <template #append>
  400. <el-button size="small">选择产品</el-button>
  401. </template>
  402. </el-input>
  403. </el-form-item>
  404. </el-col>
  405. <el-col :span="8">
  406. <el-form-item
  407. label="产品名称"
  408. :required="form.recordRulesClassify != '4'"
  409. :prop="form.recordRulesClassify != '4' ? 'productName' : ''"
  410. >
  411. <el-input
  412. v-model="form.productName"
  413. placeholder="请选择产品信息"
  414. @click.native="openProductDialog"
  415. readonly
  416. >
  417. <template #append>
  418. <el-button size="small">选择产品</el-button>
  419. </template>
  420. </el-input>
  421. </el-form-item>
  422. </el-col>
  423. <el-col :span="8">
  424. <el-form-item label="批次号" prop="batchNo">
  425. <el-input
  426. v-model="form.batchNo"
  427. placeholder="请输入"
  428. :disabled="Boolean(form.workOrderId)"
  429. ></el-input>
  430. </el-form-item>
  431. </el-col>
  432. </el-row>
  433. <el-row style="margin-bottom: 20px">
  434. <el-col :span="8">
  435. <el-form-item label="规格" prop="specification">
  436. <el-input
  437. v-model="form.specification"
  438. placeholder="请输入"
  439. :disabled="Boolean(form.workOrderId)"
  440. ></el-input>
  441. </el-form-item>
  442. </el-col>
  443. <el-col :span="8">
  444. <el-form-item label="型号" prop="productModel">
  445. <el-input
  446. v-model="form.productModel"
  447. placeholder="请输入"
  448. :disabled="Boolean(form.workOrderId)"
  449. ></el-input>
  450. </el-form-item>
  451. </el-col>
  452. <el-col :span="8">
  453. <el-form-item
  454. label="要求生产数量"
  455. :prop="form.recordRulesClassify != '4' ? 'formingNum' : ''"
  456. >
  457. <el-input
  458. v-model.number="form.formingNum"
  459. placeholder="请输入"
  460. :disabled="Boolean(form.workOrderId)"
  461. ></el-input>
  462. </el-form-item>
  463. </el-col>
  464. </el-row>
  465. <material
  466. v-if="
  467. form.produceTaskId &&
  468. form.produceTaskInstanceId &&
  469. workOrderInfo &&
  470. reportWorkType == 2 &&
  471. form.itemType == 2
  472. "
  473. ref="materialRef"
  474. :pickDetails.sync="form.pickDetails"
  475. :outputDetails.sync="form.outputDetails"
  476. :preOutputDetails="preOutputDetails"
  477. :workOrderId="form.workOrderId"
  478. :ruleId="form.ruleId"
  479. :produceTaskId="form.produceTaskId"
  480. :produceTaskName="form.produceTaskName"
  481. :produceTaskInstanceId="form.produceTaskInstanceId"
  482. :bomCategoryId="workOrderInfo.bomCategoryId"
  483. :outputType="form.outputType"
  484. :categoryId="workOrderInfo.categoryId"
  485. @refresh="getListByWorkOrderId"
  486. ></material>
  487. <header-title
  488. v-if="form.itemType == 2"
  489. title="检查项目"
  490. style="margin-top: 20px"
  491. ></header-title>
  492. <ele-pro-table
  493. v-if="form.itemType == 2"
  494. v-loading="loading"
  495. ref="table"
  496. row-key="id"
  497. :columns="detailsColumns"
  498. :datasource="form.details"
  499. cacheKey="mes-releaseRulesDialong-2510311656"
  500. :needPage="false"
  501. >
  502. <template v-slot:toolkit>
  503. <el-button
  504. v-if="form.recordRulesClassify != 4"
  505. type="primary"
  506. @click="batchCheck"
  507. >批量检查</el-button
  508. >
  509. <el-button
  510. v-if="form.recordRulesClassify != 4"
  511. type="primary"
  512. @click="batchQualified"
  513. >批量合格</el-button
  514. >
  515. </template>
  516. <template v-slot:paramValue="{ row }">
  517. <div v-if="form.recordRulesClassify == 4">
  518. {{ row.productName || row.name }}
  519. </div>
  520. <div v-else>
  521. {{ row.paramValue }}
  522. </div>
  523. </template>
  524. <template v-slot:toolNames="{ row }">
  525. <el-link :underline="false" style="cursor: pointer">
  526. <div class="ele-cell">
  527. <div @click="handleAdd(row)">
  528. {{ row.toolNames ? row.toolNames : '请选择' }}
  529. </div>
  530. <i
  531. v-if="!row.toolNames"
  532. class="el-icon-arrow-down"
  533. @click="handleAdd(row)"
  534. ></i>
  535. <i v-else class="el-icon-close" @click="clearTool(row)"></i>
  536. </div>
  537. </el-link>
  538. </template>
  539. <template v-slot:checkUsersIds="{ row }">
  540. <div>
  541. <el-select
  542. v-model="row.checkUsersIds"
  543. placeholder="请选择检查人"
  544. filterable
  545. multiple
  546. @change="checkUsersIdsChange(row)"
  547. >
  548. <el-option
  549. v-for="item in activeTeamUserList"
  550. :label="item.name"
  551. :value="item.id"
  552. :key="item.id"
  553. >
  554. </el-option>
  555. </el-select>
  556. </div>
  557. </template>
  558. <template v-slot:checkStatus="{ row }">
  559. <div>
  560. <el-radio-group v-model="row.checkStatus">
  561. <el-radio :label="1">已检查</el-radio>
  562. <el-radio :label="0">未检查</el-radio>
  563. </el-radio-group>
  564. </div>
  565. </template>
  566. <template v-slot:errorMsg="{ row }">
  567. <div>
  568. <el-input
  569. type="text"
  570. :rows="1"
  571. placeholder="请输入"
  572. v-model="row.errorMsg"
  573. >
  574. <template v-if="row.unitName" slot="append">
  575. <div>{{ row.unitName }}</div>
  576. </template>
  577. </el-input>
  578. </div></template
  579. >
  580. <template v-slot:checkResult="{ row }">
  581. <div>
  582. <el-radio-group v-model="row.checkResult">
  583. <el-radio :label="1">合格</el-radio>
  584. <el-radio :label="0">不合格</el-radio>
  585. </el-radio-group>
  586. </div>
  587. </template>
  588. </ele-pro-table>
  589. </el-form>
  590. <bpmDetail
  591. v-if="activeComp == 'bpm' && details && details.processInstanceId"
  592. :id="details.processInstanceId"
  593. >
  594. </bpmDetail>
  595. </div>
  596. <template v-if="type == 'detail'" v-slot:footer>
  597. <el-button @click="handleClose" :loading="butLoading">关 闭</el-button>
  598. </template>
  599. <template v-else v-slot:footer>
  600. <template
  601. v-if="
  602. ($hasPermission('mes:producetaskrulerecord:tempsu') ||
  603. $hasPermission('mes:producetaskrulerecord:tempsus')) &&
  604. form.executeMethod == '1'
  605. "
  606. >
  607. <el-button
  608. v-if="$hasPermission('mes:producetaskrulerecord:tempsu')"
  609. type="primary"
  610. @click="save"
  611. :loading="butLoading"
  612. :disabled="form.executeStatus != 0"
  613. >保存</el-button
  614. >
  615. <el-button
  616. v-if="$hasPermission('mes:producetaskrulerecord:tempsus')"
  617. type="primary"
  618. @click="submit"
  619. :loading="butLoading"
  620. >执行</el-button
  621. >
  622. </template>
  623. <template
  624. v-if="
  625. ($hasPermission('mes:producetaskrecordrulesrecord:saveorupdate') ||
  626. $hasPermission('mes:producetaskrecordrulesrecord:sus')) &&
  627. form.executeMethod == '2'
  628. "
  629. >
  630. <el-button
  631. v-if="$hasPermission('mes:producetaskrecordrulesrecord:saveorupdate')"
  632. type="primary"
  633. @click="save"
  634. :loading="butLoading"
  635. >保存</el-button
  636. >
  637. <el-button
  638. v-if="$hasPermission('mes:producetaskrecordrulesrecord:sus')"
  639. type="primary"
  640. @click="submit"
  641. :loading="butLoading"
  642. >执行</el-button
  643. >
  644. </template>
  645. <template v-if="form.executeMethod == '3'">
  646. <el-button
  647. type="primary"
  648. @click="save"
  649. :loading="butLoading"
  650. :disabled="form.executeStatus != 0"
  651. >保存</el-button
  652. >
  653. <el-button type="primary" @click="submit" :loading="butLoading"
  654. >执行</el-button
  655. >
  656. </template>
  657. <el-button @click="handleClose" :loading="butLoading">取 消</el-button>
  658. </template>
  659. <selectDevices
  660. ref="deviceSelectDialog"
  661. selectType="single"
  662. @chooseEquipment="chooseEquipment"
  663. ></selectDevices>
  664. <selectMatterRules
  665. ref="selectMatterRulesRef"
  666. @chooseRules="chooseRules"
  667. :filterType="[1, 2, 5]"
  668. ></selectMatterRules>
  669. <selectReleaseRules
  670. ref="selectReleaseRulesRef"
  671. @chooseRules="chooseReleaseRules"
  672. :notProduceTaskConfig="reportWorkType == 2"
  673. ></selectReleaseRules>
  674. <programRulesDialog
  675. ref="programRulesDialogRef"
  676. :dialogTitle="dialogTitle"
  677. @reload="reload"
  678. :isTempRecord="1"
  679. />
  680. <releaseRulesDialog
  681. v-model="showReleaseRulesDialog"
  682. ref="releaseRulesDialogRef"
  683. @reload="reload"
  684. :isTempRecord="1"
  685. />
  686. <taskDialog ref="taskDialogRef" @reload="reload" :isTempRecord="1" />
  687. <EquipmentDialog ref="EquipmentDialogRef" isMultiple="0" @choose="choose" />
  688. <!-- 选择用户 -->
  689. <SelectUser
  690. ref="SelectUserRef"
  691. v-model="showSelectUser"
  692. multipleSelect
  693. @selectUserFinished="selectUserFinished"
  694. ></SelectUser>
  695. <toolModal ref="toolModalRef" @chooseModal="chooseModal" />
  696. </ele-modal>
  697. </template>
  698. <script>
  699. import dictMixins from '@/mixins/dictMixins';
  700. import selectMatterRules from '@/components/selectMatterRules/select-matter-rules.vue';
  701. import selectReleaseRules from '@/components/selectReleaseRules/select-release-rules.vue';
  702. import selectDevices from '@/components/selectDevices/index.vue';
  703. import { produceOrder } from '@/api/aps/index.js';
  704. import { getTaskInstanceList } from '@/api/produce/job.js';
  705. import {
  706. tempSaveOrUpdate,
  707. saveRuleRecord
  708. } from '@/api/producetaskrulerecord/index.js';
  709. import programRulesDialog from '@/views/produce/components/prenatalExamination/programRulesDialog.vue';
  710. import releaseRulesDialog from '@/views/produce/components/prenatalExamination/releaseRulesDialog.vue';
  711. import taskDialog from '@/views/produce/components/prenatalExamination/taskDialog.vue';
  712. import { getById } from '@/api/produceOrder/index.js';
  713. import EquipmentDialog from './EquipmentDialog.vue';
  714. import { recordRulesDetailPage } from '@/api/recordRules/index.js';
  715. import SelectUser from '@/components/select/SelectUser/index.vue';
  716. import toolModal from './toolModal.vue';
  717. import {
  718. getById as producetaskrulerecordGetById,
  719. queryListByWorkOrderId,
  720. saveOrUpdate,
  721. saveOrUpdateAndSubmit
  722. } from '@/api/producetaskrecordrulesrecord/index.js';
  723. import bpmDetail from '@/views/bpm/processInstance/detail.vue';
  724. import bpmTask from '@/components/bpmTask/bpmTask.vue';
  725. import { getFactoryarea } from '@/api/aps/index';
  726. import { getTeam } from '@/api/produce/job.js';
  727. import material from '@/views/produce/components/prenatalExamination/material.vue';
  728. export default {
  729. name: 'editModal',
  730. mixins: [dictMixins],
  731. emits: ['reload'],
  732. components: {
  733. selectMatterRules,
  734. selectReleaseRules,
  735. selectDevices,
  736. programRulesDialog,
  737. releaseRulesDialog,
  738. EquipmentDialog,
  739. taskDialog,
  740. SelectUser,
  741. toolModal,
  742. bpmDetail,
  743. bpmTask,
  744. material
  745. },
  746. props: {
  747. // 1-产前准备,2-过程监测,3-产后检查
  748. reportWorkType: {
  749. type: Number,
  750. default: 1
  751. }
  752. },
  753. watch: {
  754. 'form.details': {
  755. handler(details) {
  756. if (this.form.itemType == 2) {
  757. const any = details.some((i) => i.checkResult === null);
  758. if (any || details.length === 0) return;
  759. const every = details.every((i) => i.checkResult == 1);
  760. this.form.conclusion = every ? 1 : 2;
  761. }
  762. },
  763. deep: true
  764. }
  765. },
  766. data() {
  767. const formBaseData = {
  768. id: null,
  769. code: '',
  770. // 设备id
  771. deviceId: null,
  772. //设备名称
  773. deviceName: '',
  774. // 记录规则执行方式,参考字典项:produce_task_config_execute_method
  775. executeMethod: '2',
  776. // 执行状态
  777. executeStatus: 0,
  778. // 记录规则事项类型,参考字典项:record_rules_item_type
  779. itemType: '2',
  780. // 工序ID
  781. produceTaskId: null,
  782. produceTaskInstanceId: '',
  783. produceTaskConfigId: '',
  784. produceRoutingId: '',
  785. produceRoutingName: '',
  786. // 工序名称
  787. produceTaskName: '',
  788. // 记录规则报工类型,参考字典项:record_rules_report_work_type
  789. reportWorkType: null,
  790. // 规则id,包括事项规则id,记录规则id,根据事项类型区分
  791. ruleId: null,
  792. // 规则名称
  793. ruleName: '',
  794. // 任务id
  795. taskId: null,
  796. itemTaskName: '',
  797. // mes生产工单表工单号 code
  798. workOrderCode: '',
  799. // workOrderId mes生产工单表id
  800. workOrderId: null,
  801. // 产品编码
  802. productCode: null,
  803. // 产品型号
  804. productModel: null,
  805. // 产品名称
  806. productName: null,
  807. // 记录规则分类,字典项:record_sheet
  808. recordRulesClassify: '',
  809. // 产品批次号
  810. batchNo: '',
  811. // 牌号
  812. brandNo: '',
  813. // 产品规格
  814. specification: '',
  815. // 要求生产数量
  816. formingNum: null,
  817. // 是否临时执行
  818. isTempRecord: 1,
  819. // 记录规则详情
  820. details: [],
  821. // 物品清单
  822. pickDetails: [],
  823. // 本次产出明细
  824. outputDetails: [],
  825. executeUsersIds: [],
  826. workshopAreaId: null,
  827. workshopArea: '',
  828. checkStartTime: null,
  829. checkFinishTime: null,
  830. executeUsersIds: [],
  831. executeUsers: [],
  832. teamId: null,
  833. duration: null,
  834. checkValidity: null,
  835. checkValidityUnit: '',
  836. recordRulesExecuteMethodName: '',
  837. recordRulesExecuteMethodId: null,
  838. conclusion: null,
  839. outputType: 1
  840. };
  841. return {
  842. loading: false,
  843. visible: false,
  844. title: '',
  845. formBaseData,
  846. form: JSON.parse(JSON.stringify(formBaseData)),
  847. // 生产工单列表
  848. workOrderList: [],
  849. //工序名称列表
  850. produceTaskList: [],
  851. // 工单信息
  852. workOrderInfo: null,
  853. butLoading: false,
  854. showReleaseRulesDialog: false,
  855. dialogTitle: '',
  856. showSelectUser: false,
  857. currentRow: null,
  858. type: '',
  859. rules: {
  860. itemType: [
  861. { required: true, message: '请选择规则事项类型', trigger: 'blur' }
  862. ],
  863. deviceName: [
  864. { required: true, message: '请选择设备', trigger: 'blur' }
  865. ],
  866. ruleName: [
  867. { required: true, message: '请选择规则', trigger: 'blur' },
  868. { required: true, message: '请选择规则', trigger: 'change' }
  869. ],
  870. productCode: [
  871. {
  872. required: true,
  873. message: '请输入产品编码',
  874. trigger: 'blur'
  875. },
  876. {
  877. required: true,
  878. message: '请输入产品编码',
  879. trigger: 'change'
  880. }
  881. ],
  882. productName: [
  883. {
  884. required: true,
  885. message: '请输入产品名称',
  886. trigger: 'blur'
  887. },
  888. {
  889. required: true,
  890. message: '请输入产品编码',
  891. trigger: 'change'
  892. }
  893. ],
  894. formingNum: [
  895. {
  896. required: true,
  897. message: '请输入要求生产数量',
  898. trigger: 'blur'
  899. },
  900. {
  901. required: true,
  902. message: '请输入产品编码',
  903. trigger: 'change'
  904. }
  905. ],
  906. // produceTaskId: [
  907. // {
  908. // validator: (rule, value, callback) => {
  909. // if (this.form.workOrderCode) {
  910. // if (!this.form.produceTaskId) {
  911. // callback(new Error('请选择工序'));
  912. // }
  913. // }
  914. // callback();
  915. // },
  916. // trigger: 'blur'
  917. // }
  918. // ],
  919. checkStartTime: [
  920. { required: true, message: '请选择检查开始时间', trigger: 'blur' },
  921. {
  922. required: true,
  923. message: '请选择检查开始时间',
  924. trigger: 'change'
  925. },
  926. {
  927. validator: (rule, value, callback) => {
  928. if (!value) return callback();
  929. const now = new Date();
  930. const start = new Date(value);
  931. callback();
  932. },
  933. trigger: 'blur'
  934. }
  935. ],
  936. checkFinishTime: [
  937. { required: true, message: '请选择检查完成时间', trigger: 'blur' },
  938. {
  939. required: true,
  940. message: '请选择检查完成时间',
  941. trigger: 'change'
  942. },
  943. {
  944. validator: (rule, value, callback) => {
  945. if (!value) return callback();
  946. const start = new Date(this.form.checkStartTime);
  947. const finish = new Date(value);
  948. if (finish <= start) {
  949. callback(new Error('结束时间必须大于开始时间'));
  950. } else {
  951. callback();
  952. }
  953. },
  954. trigger: 'blur'
  955. }
  956. ],
  957. conclusion: [
  958. { required: true, message: '请选择结论', trigger: 'blur' },
  959. { required: true, message: '请选择结论', trigger: 'change' }
  960. ],
  961. duration: [
  962. { required: true, message: '请输入工时', trigger: 'blur' },
  963. { required: true, message: '请输入工时', trigger: 'change' },
  964. {
  965. validator: (rule, value, callback) => {
  966. if (value === '' || value === null) {
  967. callback();
  968. } else if (Number(value) <= 0) {
  969. callback(new Error('工时必须大于0'));
  970. } else {
  971. callback();
  972. }
  973. },
  974. trigger: 'blur'
  975. }
  976. ],
  977. teamId: [
  978. { required: true, message: '请选择班组', trigger: 'blur' },
  979. { required: true, message: '请选择班组', trigger: 'change' }
  980. ]
  981. },
  982. details: null,
  983. tabOptions: [
  984. { key: 'main', name: '事项信息' },
  985. { key: 'bpm', name: '流程详情' }
  986. ],
  987. activeComp: 'main',
  988. workshopAreaList: [],
  989. checked: false,
  990. teamUserList: [],
  991. teamList: [],
  992. teamAllList: [],
  993. preOutputDetails: [],
  994. outputTypeList: [
  995. { label: '原材料', value: 1 },
  996. { label: '在制品', value: 2 },
  997. { label: 'BOM标准产出', value: 3 }
  998. ]
  999. };
  1000. },
  1001. computed: {
  1002. reportWorkTypeName() {
  1003. switch (this.reportWorkType) {
  1004. case 1:
  1005. return '产前准备';
  1006. case 2:
  1007. return '过程监测';
  1008. default:
  1009. return '产后检查';
  1010. }
  1011. },
  1012. // 规则详情表头
  1013. detailsColumns() {
  1014. let list = [
  1015. {
  1016. width: 45,
  1017. type: 'index',
  1018. columnKey: 'index',
  1019. align: 'center'
  1020. },
  1021. {
  1022. label: '检查内容',
  1023. prop: 'paramValue',
  1024. minWidth: 120,
  1025. slot: 'paramValue'
  1026. }
  1027. ];
  1028. if (this.form.recordRulesClassify != '4') {
  1029. list = [
  1030. ...list,
  1031. {
  1032. label: '检查工具',
  1033. prop: 'toolNames',
  1034. minWidth: 120,
  1035. slot: 'toolNames'
  1036. },
  1037. {
  1038. label: '检查人',
  1039. prop: 'checkUsersIds',
  1040. minWidth: 120,
  1041. slot: 'checkUsersIds'
  1042. },
  1043. {
  1044. label: '检查情况',
  1045. prop: 'checkStatus',
  1046. minWidth: 120,
  1047. slot: 'checkStatus'
  1048. },
  1049. {
  1050. label: '描述',
  1051. prop: 'errorMsg',
  1052. minWidth: 120,
  1053. slot: 'errorMsg'
  1054. },
  1055. {
  1056. label: '检查结果',
  1057. prop: 'checkResult',
  1058. minWidth: 120,
  1059. slot: 'checkResult'
  1060. }
  1061. ];
  1062. } else {
  1063. list.push({
  1064. label: '描述',
  1065. prop: 'errorMsg',
  1066. minWidth: 120,
  1067. slot: 'errorMsg'
  1068. });
  1069. }
  1070. return list;
  1071. },
  1072. activeTeamUserList() {
  1073. return this.teamUserList.filter((user) =>
  1074. this.form.executeUsersIds.includes(user.id)
  1075. );
  1076. }
  1077. },
  1078. created() {
  1079. this.requestDict('记录规则报工类型');
  1080. this.requestDict('记录规则执行方式');
  1081. this.requestDict('记录规则事项类型');
  1082. this.getWorkOrderList();
  1083. if (localStorage.getItem('singleUserInfo') == '1') {
  1084. const data = JSON.parse(localStorage.getItem('chooseUserInfo'));
  1085. this.getTeamList(data.teamId);
  1086. } else {
  1087. this.getTeamList(this.$store.state.user.info.teamId);
  1088. }
  1089. this.getWorkshopArea();
  1090. },
  1091. methods: {
  1092. // 外部调用,打开弹窗
  1093. open(type, data) {
  1094. console.log('data', type, data);
  1095. this.type = type;
  1096. this.form.reportWorkType = this.reportWorkType;
  1097. if (type == 'add') {
  1098. this.title = `新增${this.reportWorkTypeName}事项`;
  1099. } else if (type == 'edit') {
  1100. this.title = `编辑${this.reportWorkTypeName}事项`;
  1101. this.form.workOrderId = data.workOrderId;
  1102. this.form.id = data.id;
  1103. console.log('this.form', this.form);
  1104. if (this.form.workOrderId) {
  1105. this.getProductTaskList(this.form.workOrderId);
  1106. // 根据工单id 获取详情
  1107. this.getWorkOrderById(this.form.workOrderId);
  1108. this.getDetias();
  1109. }
  1110. } else if (type == 'detail') {
  1111. this.title = `${this.reportWorkTypeName}事项`;
  1112. this.form.workOrderId = data.workOrderId;
  1113. this.form.id = data.id;
  1114. if (this.form.workOrderId) {
  1115. this.getProductTaskList(this.form.workOrderId);
  1116. // 根据工单id 获取详情
  1117. this.getWorkOrderById(this.form.workOrderId);
  1118. this.getDetias();
  1119. }
  1120. } else {
  1121. }
  1122. this.visible = true;
  1123. },
  1124. // 查询详情
  1125. async getDetias() {
  1126. this.loading = true;
  1127. const data = await producetaskrulerecordGetById(this.form.id);
  1128. data.tools = data.tools || [];
  1129. this.details = data;
  1130. console.log('data 详情', data);
  1131. this.$util.assignObject(this.form, data);
  1132. this.form.details = this.form.details.map((i) => {
  1133. return {
  1134. ...i,
  1135. toolNames: i.tools.map((i) => i.toolName).join(',')
  1136. };
  1137. });
  1138. // 工时毫秒转小时
  1139. this.form.duration = (this.form.duration / (1000 * 60 * 60)).toFixed(2);
  1140. this.form.executeUsersIds = this.form.executeUsers.map((i) => i.userId);
  1141. this.form.teamId =
  1142. this.form.executeUsers.length > 0
  1143. ? this.form.executeUsers[0].teamId
  1144. : '';
  1145. // 加载班组人员列表
  1146. if (this.form.teamId) {
  1147. const index = this.teamList.findIndex(
  1148. (item) => item.id == this.form.teamId
  1149. );
  1150. this.teamUserList = this.teamAllList[index];
  1151. }
  1152. console.log('this.form', this.form);
  1153. this.loading = false;
  1154. this.getListByWorkOrderId();
  1155. },
  1156. // 查询规则详情
  1157. async getRulesDetias() {
  1158. if (this.form.ruleId) {
  1159. const { list } = await recordRulesDetailPage({
  1160. pageNum: 1,
  1161. size: 999,
  1162. rulesId: this.form.ruleId
  1163. });
  1164. this.form.details = list.map((i) => {
  1165. return {
  1166. ...i,
  1167. id: null,
  1168. checkResult: null,
  1169. checkStatus: null,
  1170. checkStatusDesc: i.defaultValue || '',
  1171. errorMsg: '',
  1172. checkUsers: [],
  1173. paramValue: i.paramValue,
  1174. toolNames: i.tools.map((i) => i.toolName).join(',')
  1175. };
  1176. });
  1177. console.log('this.form.details', this.form.details);
  1178. }
  1179. },
  1180. // 关闭时清理表单
  1181. handleClose() {
  1182. this.form = JSON.parse(JSON.stringify(this.formBaseData));
  1183. this.produceTaskList = [];
  1184. this.details = null;
  1185. this.$nextTick(() => {
  1186. this.$refs.formRef.clearValidate();
  1187. this.visible = false;
  1188. });
  1189. },
  1190. // 修改规则事项类型
  1191. itemTypeChange() {
  1192. this.form.executeMethod = this.form.itemType;
  1193. this.form.ruleId = null;
  1194. this.form.ruleName = '';
  1195. this.form.details = [];
  1196. this.$nextTick(() => {
  1197. this.$refs.formRef.clearValidate();
  1198. });
  1199. },
  1200. // 去选择设备
  1201. selectDeviceId() {
  1202. if (this.type == 'detail') return;
  1203. this.$refs.deviceSelectDialog.open([]);
  1204. },
  1205. // 设备选
  1206. chooseEquipment(data, index, categoryId) {
  1207. console.log('data', data, index, categoryId);
  1208. this.form.deviceId = data?.id;
  1209. this.form.deviceName = data?.name;
  1210. },
  1211. // 去选择记录规则
  1212. selectReleaseId() {
  1213. if (this.type == 'detail') return;
  1214. this.$refs.selectReleaseRulesRef.open(
  1215. this.reportWorkType,
  1216. this.form.produceTaskId
  1217. );
  1218. },
  1219. // 选择记录规则
  1220. chooseReleaseRules(rules) {
  1221. console.log('rules', rules);
  1222. this.form.ruleId = rules?.id;
  1223. this.form.ruleName = rules?.name;
  1224. this.form.recordRulesClassify = rules?.classify + '';
  1225. this.form.recordRulesExecuteMethodId = rules?.executeMethodId;
  1226. this.form.recordRulesExecuteMethodName = rules?.executeMethodName;
  1227. this.getRulesDetias();
  1228. // 重置表单验证
  1229. this.$nextTick(() => {
  1230. this.$refs.formRef.clearValidate([
  1231. 'productCode',
  1232. 'productName',
  1233. 'formingNum'
  1234. ]);
  1235. });
  1236. },
  1237. // 去选择事项规则
  1238. selectRulesId() {
  1239. this.$refs.selectMatterRulesRef.open([this.form.ruleId]);
  1240. },
  1241. // 选择事项规则
  1242. chooseRules(rules) {
  1243. console.log('rules', rules);
  1244. this.form.ruleId = rules?.id;
  1245. this.form.ruleName = rules?.name;
  1246. },
  1247. // 获取生产工单号
  1248. async getWorkOrderList(code = '') {
  1249. if (typeof code != 'string') {
  1250. code = '';
  1251. }
  1252. const { list } = await produceOrder({
  1253. code,
  1254. pageNum: 1,
  1255. size: 50
  1256. });
  1257. console.log('生产工单', list);
  1258. this.workOrderList = list;
  1259. },
  1260. // 选择生产工单
  1261. workOrderCodeChange(code) {
  1262. console.log('code', code);
  1263. if (code) {
  1264. const workOrder = this.workOrderList.find((i) => i.code == code);
  1265. console.log('workOrder', workOrder);
  1266. this.workOrderInfo = workOrder;
  1267. this.form.workOrderId = workOrder.id;
  1268. // 赋值产品信息
  1269. this.form.productCode = workOrder.productCode;
  1270. this.form.productModel = workOrder.productModel;
  1271. this.form.productName = workOrder.productName;
  1272. this.form.batchNo = workOrder.batchNo;
  1273. this.form.specification = workOrder.specification;
  1274. this.form.formingNum = workOrder.formingNum;
  1275. this.form.brandNo = workOrder.brandNo;
  1276. this.getProductTaskList(workOrder.id);
  1277. } else {
  1278. this.workOrderInfo = null;
  1279. this.form.workOrderId = null;
  1280. // 赋值产品信息
  1281. this.form.productCode = null;
  1282. this.form.productModel = null;
  1283. this.form.productName = '';
  1284. this.form.batchNo = '';
  1285. this.form.specification = null;
  1286. this.form.formingNum = null;
  1287. this.form.brandNo = '';
  1288. this.produceTaskList = [];
  1289. }
  1290. this.form.produceTaskId = null;
  1291. this.form.produceTaskName = '';
  1292. this.form.produceTaskInstanceId = '';
  1293. },
  1294. // 获取工序列表
  1295. async getProductTaskList(id) {
  1296. const data = await getTaskInstanceList(id);
  1297. console.log('data 工序列表', data);
  1298. this.produceTaskList = data.filter(
  1299. (i) => i.taskId != '-2' && i.taskId != '-1'
  1300. );
  1301. // 赋值工序实例id
  1302. this.form.produceTaskInstanceId = data.find(
  1303. (i) => i.sourceTaskId == this.form.produceTaskId
  1304. )?.taskId;
  1305. },
  1306. // 选择工序
  1307. produceTaskIdChange() {
  1308. const prodceTask = this.produceTaskList.find(
  1309. (i) => i.sourceTaskId == this.form.produceTaskId
  1310. );
  1311. if (prodceTask) {
  1312. this.form.produceTaskName = prodceTask.taskTypeName;
  1313. this.form.produceTaskInstanceId = prodceTask.taskId;
  1314. }
  1315. if (this.form.ruleId) {
  1316. // 清空记录规则
  1317. this.form.ruleId = null;
  1318. this.form.ruleName = null;
  1319. this.form.recordRulesClassify = null;
  1320. this.form.recordRulesExecuteMethodId = null;
  1321. this.form.recordRulesExecuteMethodName = null;
  1322. this.$message.warning(
  1323. '工序变更,已清空已选择的记录规则,请选择工序下的记录规则'
  1324. );
  1325. }
  1326. // 查询物料信息
  1327. this.getListByWorkOrderId();
  1328. },
  1329. // 执行
  1330. submit() {
  1331. this.$refs.formRef.validate(async (valid) => {
  1332. if (!valid) {
  1333. return '';
  1334. }
  1335. console.log('this.form', this.form);
  1336. if (this.form.executeMethod == 1) {
  1337. // 设备保养计划相关逻辑
  1338. this.dialogTitle = '新增设备保养计划';
  1339. this.$refs.programRulesDialogRef.init(
  1340. this.form,
  1341. this.workOrderInfo ? this.workOrderInfo : this.form,
  1342. {
  1343. name: this.form.produceTaskName
  1344. }
  1345. );
  1346. } else if (this.form.executeMethod == 2) {
  1347. // 验证产出物数量;
  1348. const valid = this.$refs.materialRef.validateOutputQuantities();
  1349. if (!valid) {
  1350. return;
  1351. }
  1352. this.releaseRulesSaveOrSubmit('submit');
  1353. } else {
  1354. // 任务确认
  1355. this.saveRuleRecord();
  1356. }
  1357. });
  1358. },
  1359. // 保存
  1360. save() {
  1361. console.log('this.form', this.form);
  1362. this.$refs.formRef.validate(async (valid) => {
  1363. if (!valid) {
  1364. return '';
  1365. }
  1366. try {
  1367. if (this.form.itemType == 2) {
  1368. // 验证产出物数量;
  1369. const valid = this.$refs.materialRef.validateOutputQuantities();
  1370. if (!valid) {
  1371. return;
  1372. }
  1373. // 记录规则保存
  1374. return this.releaseRulesSaveOrSubmit('save');
  1375. }
  1376. this.butLoading = true;
  1377. // 事项和任务确认保存
  1378. const id = await tempSaveOrUpdate(this.form);
  1379. this.form.id = id;
  1380. this.$message.success('保存成功!');
  1381. this.$emit('reload');
  1382. this.handleClose();
  1383. this.butLoading = false;
  1384. } catch (error) {
  1385. this.butLoading = false;
  1386. }
  1387. });
  1388. },
  1389. // 记录规则保存或者 一键报工
  1390. async releaseRulesSaveOrSubmit(type) {
  1391. if (this.form.executeUsersIds.length == 0) {
  1392. this.$message.warning('请选择执行人!');
  1393. return;
  1394. }
  1395. if (this.form.duration <= 0) {
  1396. this.$message.warning('工时必须大于0!');
  1397. return;
  1398. }
  1399. // 报工需要验证 缓存不验证 排除 recordRulesClassify ==4 物料添加 的情况
  1400. if (type == 'submit' && this.form.recordRulesClassify != '4') {
  1401. // 验证检查项目
  1402. const detailRequired = this.form.details.some((i) => {
  1403. return (
  1404. i.checkResult == null ||
  1405. !i.checkStatus ||
  1406. i.checkUsers?.length == 0
  1407. );
  1408. });
  1409. if (detailRequired) {
  1410. return this.$message.warning(
  1411. '请先完善 检查人、检查情况、检查结果 内容!'
  1412. );
  1413. }
  1414. }
  1415. const body = JSON.parse(JSON.stringify(this.form));
  1416. // 工时小时转毫秒
  1417. body.duration = Number(body.duration);
  1418. body.duration = body.duration * 60 * 60 * 1000;
  1419. this.butLoading = true;
  1420. console.log('body', body);
  1421. try {
  1422. if (type == 'submit') {
  1423. await saveOrUpdateAndSubmit(body);
  1424. this.$message.success('报工成功!');
  1425. } else {
  1426. const id = await saveOrUpdate(body);
  1427. this.form.id = id;
  1428. this.$message.success('保存成功!');
  1429. }
  1430. this.butLoading = false;
  1431. // 返回
  1432. this.handleClose();
  1433. this.$emit('reload');
  1434. } catch (error) {
  1435. this.butLoading = false;
  1436. }
  1437. },
  1438. // 任务确认报工
  1439. async saveRuleRecord() {
  1440. this.butLoading = true;
  1441. await saveRuleRecord(this.form);
  1442. this.$message.success('报工成功!');
  1443. this.butLoading = false;
  1444. // 返回
  1445. this.handleClose();
  1446. this.$emit('reload');
  1447. },
  1448. // 执行完成
  1449. reload() {
  1450. this.$emit('reload');
  1451. this.handleClose();
  1452. },
  1453. // 获取工单详情
  1454. async getWorkOrderById(id) {
  1455. const data = await getById(id);
  1456. console.log('工单详情', data);
  1457. this.workOrderInfo = data;
  1458. },
  1459. openProductDialog() {
  1460. if (this.form.workOrderId) {
  1461. return this.$message.warning('已选择生产工单,不能修改产品信息');
  1462. }
  1463. this.$refs.EquipmentDialogRef.open();
  1464. },
  1465. // 选择产品
  1466. choose(data) {
  1467. console.log('data', data);
  1468. const info = data[0];
  1469. if (info) {
  1470. this.form.productCode = info.code;
  1471. this.form.productName = info.name;
  1472. this.form.productModel = info.model;
  1473. this.form.specification = info.specification;
  1474. }
  1475. },
  1476. showCheckUserNames(userList) {
  1477. if (userList.length == 0) return '请选择部门-选择员工';
  1478. return userList
  1479. .map((i) => {
  1480. return (i.groupName || i.teamName) + '-' + i.userName;
  1481. })
  1482. .join(',');
  1483. },
  1484. openSelectUser(row) {
  1485. this.currentRow = row;
  1486. console.log('row', row);
  1487. this.showSelectUser = true;
  1488. },
  1489. selectUserFinished(userInfo) {
  1490. console.log('userInfo', userInfo);
  1491. this.currentRow.checkUsers = userInfo.map((i) => {
  1492. // 构建参数和接口的对应上
  1493. return { ...i, userName: i.name, userId: i.id };
  1494. });
  1495. },
  1496. // 选择工具
  1497. handleAdd(row) {
  1498. this.currentRow = row;
  1499. this.$refs.toolModalRef.open(row.tools.map((i) => i.toolCode));
  1500. },
  1501. chooseModal(data) {
  1502. console.log('data', data);
  1503. this.currentRow.tools = data.map((i) => {
  1504. return {
  1505. toolCode: i.code,
  1506. toolName: i.name
  1507. };
  1508. });
  1509. this.currentRow.toolNames = this.currentRow.tools
  1510. .map((i) => i.toolName)
  1511. .join(',');
  1512. },
  1513. clearTool(row) {
  1514. row.tools = [];
  1515. row.toolNames = '';
  1516. },
  1517. async getListByWorkOrderId(type = '') {
  1518. if (!this.form.produceTaskId || this.reportWorkType != 2) return;
  1519. // 查询物料信息
  1520. const materialObject = await queryListByWorkOrderId({
  1521. workOrderId: this.form.workOrderId,
  1522. recordId: this.form.id,
  1523. produceTaskId: this.form.produceTaskId,
  1524. ruleId: this.form.ruleId
  1525. });
  1526. console.log('materialObject 物料信息', materialObject);
  1527. if (type == '') {
  1528. this.addForm.outputDetails = materialObject.outputDetails;
  1529. this.addForm.pickDetails = materialObject.pickDetails.map((i) => {
  1530. // 物料清单中如果存在则 selected 设置为 true
  1531. const any = this.addForm.outputDetails.find(
  1532. (j) => j.categoryId === i.categoryId
  1533. );
  1534. if (any) {
  1535. i.selected = true;
  1536. } else {
  1537. i.selected = false;
  1538. }
  1539. return i;
  1540. });
  1541. this.preOutputDetails = materialObject.preOutputDetails;
  1542. }
  1543. if (type == 'output') {
  1544. this.addForm.outputDetails = materialObject.outputDetails;
  1545. this.addForm.pickDetails = this.addForm.pickDetails.map((i) => {
  1546. // 物料清单中如果存在则 selected 设置为 true
  1547. const any = this.addForm.outputDetails.find(
  1548. (j) => j.categoryId === i.categoryId
  1549. );
  1550. if (any) {
  1551. i.selected = true;
  1552. } else {
  1553. i.selected = false;
  1554. }
  1555. return i;
  1556. });
  1557. }
  1558. },
  1559. // qualifiedQuantityMax 最大合格数量
  1560. qualifiedQuantityMax(row) {
  1561. return row.reportQuantity - row.noQualifiedQuantity;
  1562. },
  1563. noQualifiedQuantityMax(row) {
  1564. return row.reportQuantity - row.qualifiedQuantity;
  1565. },
  1566. // 批量检查
  1567. batchCheck() {
  1568. this.form.details = this.form.details.map((i) => {
  1569. i.checkStatus = 1;
  1570. return i;
  1571. });
  1572. },
  1573. // 批量合格
  1574. batchQualified() {
  1575. this.form.details = this.form.details.map((i) => {
  1576. i.checkResult = 1;
  1577. return i;
  1578. });
  1579. },
  1580. workshopAreaIdChange(e) {
  1581. const area = this.workshopAreaList.find((i) => i.id === e);
  1582. if (area) {
  1583. this.form.workshopArea = area.name;
  1584. } else {
  1585. this.form.workshopArea = '';
  1586. }
  1587. },
  1588. // 查询车间区域
  1589. async getWorkshopArea() {
  1590. const data = await getFactoryarea({
  1591. pageNum: 1,
  1592. size: 999,
  1593. type: 3
  1594. });
  1595. console.log('list', data.list);
  1596. this.workshopAreaList = data.list;
  1597. },
  1598. // 计算工时
  1599. computedDuration() {
  1600. if (
  1601. this.form.checkStartTime &&
  1602. this.form.checkFinishTime &&
  1603. this.form.executeUsersIds.length > 0
  1604. ) {
  1605. const start = new Date(this.form.checkStartTime);
  1606. const finish = new Date(this.form.checkFinishTime);
  1607. const diff = finish - start; // 毫秒差值
  1608. const hours = diff / (1000 * 60 * 60); // 转换为小时
  1609. const totalDuration = hours * this.form.executeUsersIds.length;
  1610. this.form.duration = totalDuration.toFixed(1);
  1611. }
  1612. },
  1613. checkTeamList(id) {
  1614. this.form.executeUsersIds = [];
  1615. const index = this.teamList.findIndex((item) => item.id == id);
  1616. this.teamUserList = this.teamAllList[index];
  1617. console.log('this.teamUserList', this.teamUserList);
  1618. },
  1619. async getTeamList(id) {
  1620. const ids = id.split(',');
  1621. this.teamList = [];
  1622. this.teamUserList = [];
  1623. const list = ids.map((item) => getTeam(item));
  1624. const dataList = await Promise.all(list);
  1625. dataList.forEach((item) => {
  1626. this.teamList.push({
  1627. name: item.name,
  1628. id: item.id
  1629. });
  1630. this.teamAllList.push(item.userVOList);
  1631. });
  1632. },
  1633. changeId() {
  1634. if (this.form.executeUsersIds.length == this.teamUserList.length) {
  1635. this.checked = true;
  1636. } else {
  1637. this.checked = false;
  1638. }
  1639. // 同步 executeUsers
  1640. this.form.executeUsers = this.form.executeUsersIds
  1641. .map((id) => {
  1642. const user = this.teamUserList.find((item) => item.id === id);
  1643. console.log('user', user);
  1644. if (user) {
  1645. return {
  1646. teamId: this.form.teamId,
  1647. teamName: this.teamList.find(
  1648. (team) => team.id == this.form.teamId
  1649. )?.name,
  1650. userId: user.id,
  1651. userName: user.name
  1652. };
  1653. } else {
  1654. return null;
  1655. }
  1656. })
  1657. .filter((item) => item !== null);
  1658. console.log('this.form.executeUsers', this.form.executeUsers);
  1659. this.computedDuration();
  1660. // 同步详情执行人
  1661. this.form.details.forEach((detail) => {
  1662. detail.checkUsersIds = this.form.executeUsersIds;
  1663. detail.checkUsers = this.form.executeUsers;
  1664. });
  1665. },
  1666. checkChange() {
  1667. this.form.executeUsersIds = [];
  1668. if (this.checked) {
  1669. this.form.executeUsersIds = this.teamUserList.map((item) => item.id);
  1670. } else {
  1671. this.form.executeUsersIds = [];
  1672. }
  1673. },
  1674. durationChagne() {
  1675. // 保留小数后一位
  1676. if (this.form.duration && this.form.duration.toString().includes('.')) {
  1677. this.form.duration = Number(this.form.duration).toFixed(1);
  1678. }
  1679. },
  1680. checkUsersIdsChange(row) {
  1681. // 同步 checkUsers
  1682. row.checkUsers = row.checkUsersIds.map((i) => {
  1683. const user = this.activeTeamUserList.find((item) => item.id === i);
  1684. return {
  1685. teamId: this.form.teamId,
  1686. teamName: this.teamList.find((team) => team.id == this.form.teamId)
  1687. ?.name,
  1688. userId: user.id,
  1689. userName: user.name
  1690. };
  1691. });
  1692. console.log('row', row);
  1693. }
  1694. }
  1695. };
  1696. </script>
  1697. <style scoped lang="scss">
  1698. .mask-box {
  1699. position: relative;
  1700. &::after {
  1701. content: '';
  1702. width: 100%;
  1703. height: 100%;
  1704. position: absolute;
  1705. top: 0;
  1706. left: 0;
  1707. background: rgba(0, 0, 0, 0);
  1708. cursor: pointer;
  1709. }
  1710. }
  1711. .checkboxWrapper {
  1712. padding: 8px 20px;
  1713. border-bottom: 1px solid #ccc;
  1714. }
  1715. </style>