BaseForm.vue 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804
  1. <template>
  2. <a-modal :title="modalTitle" :width="1200" :visible="visible" :confirmLoading="confirmLoading" @cancel="handleCancel">
  3. <a-form :form="form">
  4. <a-form-item v-show="false">
  5. <a-input v-decorator="['id']" type="hidden" />
  6. <a-input v-decorator="['sbId']" type="hidden" />
  7. <a-input v-decorator="['part']" type="hidden" />
  8. </a-form-item>
  9. <row-list :col="2">
  10. <row-item>
  11. <a-form-item label="编码" :labelCol="BaseTool.Constant.labelCol" :wrapperCol="BaseTool.Constant.wrapperCol">
  12. <a-input disabled v-decorator="['no', { rules: [{ required: false, message: '编码不能为空' }] }]" />
  13. </a-form-item>
  14. </row-item>
  15. <row-item>
  16. <a-form-item label="设备编号" :labelCol="BaseTool.Constant.labelCol" :wrapperCol="BaseTool.Constant.wrapperCol">
  17. <a-input disabled style="width: 80%"
  18. v-decorator="['sbNo', { rules: [{ required: false, message: '请选择设备' }] }]" />
  19. <a-button type="primary" style="width: 20%" @click="handleSbSelect">选择</a-button>
  20. </a-form-item>
  21. </row-item>
  22. <!-- <row-item>
  23. <a-form-item
  24. label="标准名称"
  25. :labelCol="BaseTool.Constant.labelCol"
  26. :wrapperCol="BaseTool.Constant.wrapperCol"
  27. >
  28. <a-input
  29. v-decorator="['name', {rules: [{required: true, message: '标准名称不能为空'}]}]"/>
  30. </a-form-item>
  31. </row-item>-->
  32. <row-item>
  33. <a-form-item label="维护部位" :labelCol="BaseTool.Constant.labelCol" :wrapperCol="BaseTool.Constant.wrapperCol">
  34. <a-input disabled style="width: 80%" v-decorator="['partName']" />
  35. <a-button type="primary" style="width: 20%" @click="handlePartSelect">选择</a-button>
  36. </a-form-item>
  37. </row-item>
  38. <row-item>
  39. <a-form-item label="维护等级" :labelCol="BaseTool.Constant.labelCol" :wrapperCol="BaseTool.Constant.wrapperCol">
  40. <a-select @change="changeLevel"
  41. v-decorator="['level', { rules: [{ required: true, message: '维护等级不能为空' }] }]" placeholder="请选择">
  42. <a-select-option v-for="(label, value) in levelMap" :key="value" :label="label"
  43. :value="parseInt(value)">{{ label }}
  44. </a-select-option>
  45. </a-select>
  46. </a-form-item>
  47. </row-item>
  48. <row-item>
  49. <a-form-item label="执行人方式" :labelCol="BaseTool.Constant.labelCol" :wrapperCol="BaseTool.Constant.wrapperCol">
  50. <a-select @change="handleCheckUserTypeChange"
  51. v-decorator="['checkUserType', { rules: [{ required: true, message: '执行人方式不能为空' }] }]" placeholder="请选择">
  52. <a-select-option v-for="(label, value) in checkUserTypeMap" :key="value" :label="label"
  53. :value="parseInt(value)">{{ label }}
  54. </a-select-option>
  55. </a-select>
  56. </a-form-item>
  57. </row-item>
  58. <row-item v-if="currentCheckUserType === 4">
  59. <a-form-item label="执行班组" :labelCol="BaseTool.Constant.labelCol" :wrapperCol="BaseTool.Constant.wrapperCol">
  60. <a-tree-select style="width: 100%" :dropdownStyle="{ maxHeight: '400px', overflow: 'auto' }"
  61. :treeData="deptTree" treeNodeFilterProp="title" :showSearch="true"
  62. v-decorator="['checkDeptId', { rules: [{ required: true, message: '请选择执行班组' }] }]" placeholder="请选择班组">
  63. </a-tree-select>
  64. </a-form-item>
  65. </row-item>
  66. <row-item>
  67. <a-form-item label="计划周期" :labelCol="BaseTool.Constant.labelCol" :wrapperCol="BaseTool.Constant.wrapperCol"
  68. style="margin-bottom:0;">
  69. <a-form-item :style="{ display: 'inline-block', width: '70%' }">
  70. <a-input-number style="width: 100%" :min="1"
  71. v-decorator="['period', { rules: [{ required: true, message: '计划周期不能为空' }] }]" />
  72. </a-form-item>
  73. <a-form-item :style="{ display: 'inline-block', width: '30%' }">
  74. <a-select v-decorator="['periodType', { rules: [{ required: true, message: '周期类型不能为空' }] }]"
  75. placeholder="请选择">
  76. <a-select-option v-for="(label, value) in periodTypeMap" :key="value" :label="label"
  77. :value="parseInt(value)">{{ label }}
  78. </a-select-option>
  79. </a-select>
  80. </a-form-item>
  81. </a-form-item>
  82. </row-item>
  83. <row-item>
  84. <a-form-item label="标准工时" :labelCol="BaseTool.Constant.labelCol" :wrapperCol="BaseTool.Constant.wrapperCol">
  85. <a-input v-decorator="['standardHours']" suffix="小时" />
  86. </a-form-item>
  87. </row-item>
  88. <!-- <row-item>
  89. <a-form-item
  90. label="类型"
  91. :labelCol="BaseTool.Constant.labelCol"
  92. :wrapperCol="BaseTool.Constant.wrapperCol"
  93. >
  94. <a-select
  95. disabled
  96. v-show="false"
  97. v-decorator="['type', {initialValue:checkType,rules: [{required: true, message: '检查类型不能为空'}]}]"
  98. placeholder="请选择">
  99. <a-select-option
  100. v-for="(label,value) in typeMap"
  101. :key="value"
  102. :label="label"
  103. :value="parseInt(value)">{{ label }}
  104. </a-select-option>
  105. </a-select>
  106. </a-form-item>
  107. </row-item>-->
  108. <row-item>
  109. <a-form-item label="排序" :labelCol="BaseTool.Constant.labelCol" :wrapperCol="BaseTool.Constant.wrapperCol">
  110. <a-input-number :step="1"
  111. v-decorator="['sort', { initialValue: 1, rules: [{ required: true, message: '排序不能为空' }] }]" />
  112. </a-form-item>
  113. </row-item>
  114. <row-item>
  115. <a-form-item label="动作类型" :labelCol="BaseTool.Constant.labelCol" :wrapperCol="BaseTool.Constant.wrapperCol">
  116. <a-select v-decorator="[
  117. 'actionType',
  118. { initialValue: 1, rules: [{ required: true, message: '是否启用不能为空' }] }
  119. ]" placeholder="请选择">
  120. <a-select-option v-for="(label, value) in actionTypeMap" :key="value" :label="label"
  121. :value="parseInt(value)">{{ label }}
  122. </a-select-option>
  123. </a-select>
  124. </a-form-item>
  125. </row-item>
  126. <!-- <row-item>
  127. <a-form-item
  128. v-show="false"
  129. label="是否启用"
  130. :labelCol="BaseTool.Constant.labelCol"
  131. :wrapperCol="BaseTool.Constant.wrapperCol"
  132. >
  133. <a-select
  134. v-show="false"
  135. v-decorator="['enable', {initialValue:1,rules: [{required: true, message: '是否启用不能为空'}]}]"
  136. placeholder="请选择">
  137. <a-select-option
  138. v-for="(label,value) in enableMap"
  139. :key="value"
  140. :label="label"
  141. :value="parseInt(value)">{{ label }}
  142. </a-select-option>
  143. </a-select>
  144. </a-form-item>
  145. </row-item>-->
  146. <row-item>
  147. <a-form-item label="上次实际执行日期" :labelCol="BaseTool.Constant.labelCol"
  148. :wrapperCol="BaseTool.Constant.wrapperCol">
  149. <a-date-picker style="width: 100%" :format="BaseTool.Date.PICKER_NORM_DATE_PATTERN"
  150. v-decorator="['lastDate']" />
  151. </a-form-item>
  152. </row-item>
  153. <row-item>
  154. <a-form-item label="下次预计执行日期" :labelCol="BaseTool.Constant.labelCol"
  155. :wrapperCol="BaseTool.Constant.wrapperCol">
  156. <a-date-picker disabled style="width: 100%" :format="BaseTool.Date.PICKER_NORM_DATE_PATTERN"
  157. v-decorator="['nextDate']" />
  158. </a-form-item>
  159. </row-item>
  160. <row-item>
  161. <a-form-item label="标准类型" :labelCol="BaseTool.Constant.labelCol" :wrapperCol="BaseTool.Constant.wrapperCol">
  162. <a-tree-select style="width: 100%" :dropdownStyle="{ maxHeight: '400px', overflow: 'auto' }"
  163. :treeData="treeData" :treeNodeFilterProp="'title'" :showSearch="true"
  164. v-decorator="['sbType', { rules: [{ required: true, message: '标准类型不能为空' }] }]" placeholder="请选择"
  165. @change="handleSbTypeChange">
  166. </a-tree-select>
  167. </a-form-item>
  168. <!-- <a-form-item label="检查项目" :labelCol="BaseTool.Constant.labelCol" :wrapperCol="BaseTool.Constant.wrapperCol">
  169. <a-select mode="multiple" :maxTagCount="5" v-decorator="['requirementList', {rules: [{required: true, message: '检查项目不能为空'}]}]" placeholder="请选择">
  170. <a-select-option v-for="item in checkDetailList" :key="item.id" :label="item.stdName" :value="item.id">{{ item.stdName }}
  171. </a-select-option>
  172. </a-select>
  173. </a-form-item> -->
  174. </row-item>
  175. </row-list>
  176. <row-list :col="1">
  177. <row-item>
  178. <a-form-item label="执行标准" :labelCol="BaseTool.Constant.labelCol2" :wrapperCol="BaseTool.Constant.wrapperCol2">
  179. <a-textarea :rows="4" v-decorator="['remark', { rules: [{ required: false, message: '操作说明及标准不能为空' }] }]" />
  180. </a-form-item>
  181. </row-item>
  182. </row-list>
  183. <row-list :col="2">
  184. <row-item>
  185. <a-form-item label="图片" :labelCol="BaseTool.Constant.labelCol" :wrapperCol="BaseTool.Constant.wrapperCol">
  186. <a-upload :action="uploadUrl" :multiple="true" list-type="picture" accept="image/*"
  187. :file-list="this.defaultCheckImgList" @change="handleCheckImgChange" :headers="headers">
  188. <a-button> <a-icon type="upload" /> 选择上传图片 </a-button>
  189. </a-upload>
  190. </a-form-item>
  191. </row-item>
  192. <row-item>
  193. <a-form-item label="文件" :labelCol="BaseTool.Constant.labelCol" :wrapperCol="BaseTool.Constant.wrapperCol">
  194. <a-upload :action="uploadUrl" :multiple="true" :file-list="this.defaultCheckFileList"
  195. @change="handleCheckFileChange" :headers="headers">
  196. <a-button> <a-icon type="upload" /> 选择上传文件 </a-button>
  197. </a-upload>
  198. </a-form-item>
  199. </row-item>
  200. </row-list>
  201. </a-form>
  202. <title-divider title="检查项目" width="100px"></title-divider>
  203. <a-table size="small" :data-source="requirementList" :columns="columns2" bordered ref="table"
  204. :row-selection="rowSelection2" rowKey="id" :pagination="false"
  205. :scroll="{ x: 1100, y: BaseTool.Constant.scrollY }">
  206. <template slot="num" slot-scope="text, record">
  207. <div class="editable-cell-input-wrapper">
  208. <a-input :value="text" :id="record.spareId + ',num'"
  209. @change="$event => onQuantityChange($event, record.id, 'num')" />
  210. </div>
  211. </template>
  212. <span slot="action" slot-scope="record">
  213. <template>
  214. <!-- <a @click="handleDetailSelect(record)">修改</a>
  215. <a-divider type="vertical" />-->
  216. <a-popconfirm title="是否要删除该条数据?" @confirm="handleDelOne(record)">
  217. <a>删除</a>
  218. </a-popconfirm>
  219. </template>
  220. </span>
  221. </a-table>
  222. <title-divider title="关联备件" width="100px"></title-divider>
  223. <div class="table-operator">
  224. <a-button style="margin-left:8px;" type="primary" @click="handleSpareSelect">
  225. <a-icon type="plus" />
  226. 添加
  227. </a-button>
  228. <a-button class="margin-left8" size="small" type="danger" @click="handleDel">
  229. <a-icon type="delete" />
  230. 删除
  231. </a-button>
  232. </div>
  233. <a-table :data-source="data" :columns="columns" bordered ref="table" tableLayout="auto"
  234. :row-selection="rowSelection" rowKey="bomId">
  235. <template slot="num" slot-scope="text, record">
  236. <div class="editable-cell-input-wrapper">
  237. <a-input :value="text" :id="record.spareId + ',num'"
  238. @change="$event => onQuantityChange($event, record.id, 'num')" />
  239. </div>
  240. </template>
  241. <span slot="action" slot-scope="record">
  242. <template>
  243. <!-- <a @click="handleDetailSelect(record)">修改</a>
  244. <a-divider type="vertical" />-->
  245. <a-popconfirm title="是否要删除该条数据?" @confirm="handleDelOne(record)">
  246. <a>删除</a>
  247. </a-popconfirm>
  248. </template>
  249. </span>
  250. </a-table>
  251. <template slot="footer">
  252. <a-button :loading="confirmLoading" type="primary" @click="save()">保存</a-button>
  253. </template>
  254. <part-info-select-modal ref="partInfoSelectModal" @selected="handlePartSelected" />
  255. <sb-info-select-modal ref="sbInfoSelectModal" @selected="handleSbSelectd" />
  256. <spare-part-info-select-modal-sb-info :type="'checkbox'" ref="spareSelectModal" @selected="handleSpareSelected" />
  257. </a-modal>
  258. </template>
  259. <script>
  260. import pick from 'lodash.pick'
  261. import { STable, Ellipsis } from '@/components'
  262. import { addCheckStandard, fetchCheckStandard, updateCheckStandard } from '@/api/check/checkstandard'
  263. import { queryUser } from '@/api/upms/user'
  264. import { uploadUrl } from '@/api/upms/file'
  265. import PartInfoSelectModal from '@/views/part/info/modules/PartInfoSelectModal'
  266. import Vue from 'vue'
  267. import { ACCESS_TOKEN } from '@/store/mutation-types'
  268. import SparePartInfoSelectModalSbInfo from '@/views/sqarepartmanage/sparepartinfo/modules/SparePartInfoSelectModalSbInfo'
  269. import SbInfoSelectModal from '@/views/sb/info/modules/SbInfoSelectModal'
  270. import { queryCheckDetail } from '@/api/check/check-detail'
  271. import { fetchSbTypeTree } from '@/api/sb/type'
  272. import { getDeptTree } from '@/api/upms/dept'
  273. export default {
  274. name: 'BaseCheckStandard',
  275. components: {
  276. STable,
  277. Ellipsis,
  278. SbInfoSelectModal,
  279. PartInfoSelectModal,
  280. SparePartInfoSelectModalSbInfo,
  281. },
  282. data() {
  283. return {
  284. confirmLoading: false,
  285. modalTitle: null,
  286. form: this.$form.createForm(this),
  287. visible: false,
  288. sbId: null,
  289. levelMap: {},
  290. level: null,
  291. // 下拉框map
  292. typeMap: {},
  293. actionTypeMap: {},
  294. paramTypeMap: {},
  295. enableMap: {},
  296. checkUserTypeMap: {},
  297. periodTypeMap: {},
  298. currentCheckUserType: null,
  299. deptTree: [],
  300. checkImgList: [], // 图片
  301. checkFileList: [], // 文档
  302. defaultCheckImgList: [],
  303. defaultCheckFileList: [],
  304. userList: {},
  305. editingKey: '',
  306. uploadUrl: uploadUrl,
  307. treeData: [],
  308. sbType: null,
  309. requirementList: [],
  310. headers: {
  311. Authorization: 'Bearer ' + Vue.ls.get(ACCESS_TOKEN),
  312. },
  313. rowSelection: {
  314. onChange: (selectedRowKeys, selectedRows) => {
  315. this.selectedRowKeys = selectedRowKeys
  316. this.selectedRows = selectedRows
  317. },
  318. },
  319. state: {
  320. selectedRowKeys: [],
  321. selectedRows: [],
  322. },
  323. // 表头
  324. columns: [
  325. {
  326. title: '名称',
  327. dataIndex: 'spareName',
  328. },
  329. {
  330. title: '规格型号',
  331. dataIndex: 'ggxh',
  332. },
  333. {
  334. title: '数量',
  335. dataIndex: 'num',
  336. width: 150,
  337. scopedSlots: { customRender: 'num' },
  338. },
  339. {
  340. title: '操作',
  341. key: 'action',
  342. checked: true,
  343. align: 'center',
  344. // fixed: 'right',
  345. scopedSlots: { customRender: 'action' },
  346. },
  347. ],
  348. columns2: [
  349. {
  350. title: '序号',
  351. dataIndex: 'index',
  352. align: 'center',
  353. width: 80,
  354. customRender: (text, record, index) => {
  355. return index + 1
  356. }
  357. },
  358. {
  359. title: '保养周期',
  360. width: 100,
  361. align: 'center',
  362. ellipsis: true,
  363. dataIndex: 'period'
  364. },
  365. {
  366. title: '管理项目',
  367. dataIndex: 'manageItem',
  368. align: 'center',
  369. ellipsis: true,
  370. width: 200
  371. },
  372. {
  373. title: '检查项目',
  374. dataIndex: 'checkItem',
  375. align: 'center',
  376. ellipsis: true,
  377. width: 200
  378. },
  379. {
  380. title: '方法工具',
  381. ellipsis: true,
  382. align: 'center',
  383. width: 150,
  384. dataIndex: 'method'
  385. },
  386. {
  387. title: '保养级别',
  388. width: 100,
  389. align: 'center',
  390. ellipsis: true,
  391. dataIndex: 'checkLevel'
  392. },
  393. {
  394. title: '标准类型',
  395. width: 100,
  396. align: 'center',
  397. ellipsis: true,
  398. dataIndex: 'sbTypeName'
  399. },
  400. {
  401. title: '内容',
  402. width: 200,
  403. ellipsis: true,
  404. align: 'center',
  405. dataIndex: 'content'
  406. },
  407. {
  408. title: '备注',
  409. width: 100,
  410. ellipsis: true,
  411. align: 'center',
  412. dataIndex: 'remark'
  413. },
  414. ],
  415. data: [],
  416. cacheData: [],
  417. selectedRowKeys: [],
  418. selectedRows: [],
  419. checkDetailList: {},
  420. options: {
  421. rowSelection: {
  422. selectedRowKeys: this.selectedRowKeys,
  423. },
  424. },
  425. typeCheckMap: {},
  426. }
  427. },
  428. props: {
  429. /**
  430. * 检查类型: 1-点检 2-巡检
  431. */
  432. checkType: {
  433. type: Number,
  434. default: 2,
  435. },
  436. },
  437. computed: {
  438. rowSelection2() {
  439. return {
  440. selectedRowKeys: this.state.selectedRowKeys,
  441. onChange: (selectedRowKeys, selectedRows) => {
  442. this.state.selectedRowKeys = selectedRowKeys
  443. this.state.selectedRows = selectedRows
  444. },
  445. }
  446. },
  447. },
  448. created() {
  449. // 下拉框map
  450. this.paramTypeMap = this.DictCache.getLabelByValueMapByType(this.DictCache.TYPE.CHECK_STANDARD_PARAM_TYPE)
  451. this.typeCheckMap = this.DictCache.getLabelByValueMapByType('check_item_type')
  452. this.typeMap = this.DictCache.getLabelByValueMapByType(this.DictCache.TYPE.CHECK_STANDARD_TYPE)
  453. this.periodTypeMap = this.DictCache.getLabelByValueMapByType(this.DictCache.TYPE.CHECK_PLAN_PERIOD_TYPE)
  454. this.actionTypeMap = this.DictCache.getLabelByValueMapByType(this.DictCache.TYPE.CHECK_PLAN_ACTION_TYPE)
  455. this.enableMap = this.DictCache.getLabelByValueMapByType(this.DictCache.TYPE.YES_NO)
  456. this.checkUserTypeMap = this.DictCache.getLabelByValueMapByType(this.DictCache.TYPE.CHECK_USER_TYPE)
  457. this.levelMap = this.DictCache.getLabelByValueMapByType(this.DictCache.TYPE.CHECK_PLAN_LEVEL)
  458. fetchSbTypeTree().then((res) => {
  459. this.treeData = res.data
  460. })
  461. },
  462. methods: {
  463. base(record, sbId, sbNo) {
  464. this.visible = true
  465. this.selectedRowKeys = []
  466. this.selectedRows = []
  467. this.form.resetFields()
  468. queryUser({}).then((res) => {
  469. this.userList = res.data
  470. })
  471. this.loadDeptTree()
  472. queryCheckDetail().then((res) => {
  473. this.checkDetailList = res.data
  474. // 字典加载完成后,若已选定标准类型则刷新保养项列表,避免竞态导致保养项为空无法保存
  475. if (this.sbType != null) {
  476. const list = this.checkDetailList[this.sbType]
  477. if (list) {
  478. this.requirementList = list
  479. if (!this.state.selectedRows || this.state.selectedRows.length === 0) {
  480. this.state.selectedRowKeys = list.map((item) => item.id)
  481. this.state.selectedRows = list
  482. }
  483. }
  484. }
  485. })
  486. // 如果是空标识添加
  487. if (this.BaseTool.Object.isBlank(record)) {
  488. this.modalTitle = '添加'
  489. this.data = []
  490. this.cacheData = []
  491. this.sbType = null
  492. this.requirementList = []
  493. this.currentCheckUserType = null
  494. if (sbId != null) {
  495. this.sbId = sbId
  496. const {
  497. form: { setFieldsValue },
  498. } = this
  499. // 日期处理
  500. this.$nextTick(() => {
  501. setFieldsValue({ sbId: sbId, sbNo: sbNo })
  502. })
  503. }
  504. return
  505. }
  506. this.modalTitle = '编辑'
  507. if (this.BaseTool.Object.isBlank(record.id)) {
  508. this.modalTitle = '复制'
  509. }
  510. this.sbId = record.sbId
  511. this.level = record.level
  512. this.currentCheckUserType = record.checkUserType
  513. if (record.checkUserType === 4) {
  514. this.loadDeptTree()
  515. }
  516. // 查询列表
  517. this.data = record.detailList
  518. const requirementList = record.requirementList || []
  519. this.sbType = requirementList.length > 0 ? requirementList[0].sbType : null
  520. if (this.sbType != null) {
  521. this.$nextTick(() => {
  522. setFieldsValue({
  523. sbType: this.sbType,
  524. })
  525. })
  526. }
  527. this.state.selectedRowKeys = requirementList.map((item) => item.id)
  528. this.state.selectedRows = requirementList
  529. // 保养项字典未加载完成时,先回显已选保养项,避免列表空白
  530. this.requirementList = (this.checkDetailList || {})[this.sbType] || requirementList
  531. this.checkImgList = record.checkImgList
  532. this.checkFileList = record.checkFileList
  533. if (record.lastDate != null) {
  534. record.lastDate = this.BaseTool.Moment(record.lastDate, this.BaseTool.Date.PICKER_NORM_DATE_PATTERN)
  535. this.$nextTick(() => {
  536. setFieldsValue(Object.assign(pick(record, ['lastDate'])))
  537. })
  538. }
  539. if (record.nextDate != null) {
  540. record.nextDate = this.BaseTool.Moment(record.nextDate, this.BaseTool.Date.PICKER_NORM_DATE_PATTERN)
  541. this.$nextTick(() => {
  542. setFieldsValue(Object.assign(pick(record, ['nextDate'])))
  543. })
  544. }
  545. if (this.checkImgList == null) {
  546. this.defaultCheckImgList = this.BaseTool.UPLOAD.transImg(this.checkImgList)
  547. }
  548. if (this.checkImgList == null) {
  549. this.defaultCheckFileList = this.BaseTool.UPLOAD.transImg(this.checkFileList)
  550. }
  551. const {
  552. form: { setFieldsValue },
  553. } = this
  554. // 日期处理
  555. this.$nextTick(() => {
  556. setFieldsValue(
  557. Object.assign(
  558. pick(record, [
  559. 'id',
  560. 'sbId',
  561. 'sbNo',
  562. 'name',
  563. // 'no',
  564. // 'type',
  565. 'period',
  566. 'level',
  567. 'part',
  568. 'partName',
  569. 'checkUserType',
  570. 'checkUserId',
  571. 'checkDeptId',
  572. 'periodType',
  573. 'standardHours',
  574. // 'actionType',
  575. // 'enable',
  576. 'requirement',
  577. 'nextDate',
  578. 'lastDate',
  579. 'sbType',
  580. 'remark',
  581. ])
  582. )
  583. )
  584. })
  585. },
  586. save() {
  587. const {
  588. form: { validateFieldsAndScroll },
  589. } = this
  590. this.confirmLoading = true
  591. validateFieldsAndScroll((errors, values) => {
  592. if (errors) {
  593. this.confirmLoading = false
  594. return
  595. }
  596. // 上传文件
  597. values.checkImgList = this.checkImgList
  598. values.type = this.checkType
  599. // 非班组模式时清空班组ID
  600. if (values.checkUserType !== 4) {
  601. values.checkDeptId = null
  602. }
  603. values.requirementList = this.state.selectedRows
  604. if (!values.requirementList || values.requirementList.length === 0) {
  605. this.$message.error('请至少选择一个保养项')
  606. this.confirmLoading = false
  607. return
  608. }
  609. values.checkFileList = this.checkFileList
  610. values.nextDate = values.nextDate
  611. ? this.BaseTool.Date.formatter(values.nextDate, this.BaseTool.Date.PICKER_NORM_DATE_PATTERN)
  612. : null
  613. values.lastDate = values.lastDate
  614. ? this.BaseTool.Date.formatter(values.lastDate, this.BaseTool.Date.PICKER_NORM_DATE_PATTERN)
  615. : null
  616. // 备件列表
  617. values.detailList = this.data
  618. if (this.BaseTool.String.isBlank(values.id)) {
  619. addCheckStandard(values)
  620. .then(() => {
  621. this.handleCancel(values)
  622. })
  623. .catch(() => {
  624. this.confirmLoading = false
  625. })
  626. } else {
  627. updateCheckStandard(values)
  628. .then(() => {
  629. this.handleCancel(values)
  630. })
  631. .catch(() => {
  632. this.confirmLoading = false
  633. })
  634. }
  635. })
  636. },
  637. handleCancel(values) {
  638. this.visible = false
  639. this.data = []
  640. this.confirmLoading = false
  641. this.selectedRowKeys = []
  642. this.selectedRows = []
  643. this.form.resetFields()
  644. if (this.BaseTool.Object.isNotBlank(values)) {
  645. this.$emit('ok', values)
  646. }
  647. },
  648. handleSbSelect() {
  649. this.$refs.sbInfoSelectModal.base()
  650. },
  651. handleSbSelectd(keys, rows) {
  652. const [key] = keys
  653. const [row] = rows
  654. const {
  655. form: { setFieldsValue },
  656. } = this
  657. this.sbId = key
  658. // 日期处理
  659. this.$nextTick(() => {
  660. setFieldsValue(
  661. Object.assign({
  662. sbId: key,
  663. sbNo: row.no,
  664. part: null,
  665. partName: null,
  666. })
  667. )
  668. })
  669. },
  670. handlePartSelect() {
  671. const sbId = this.form.getFieldValue('sbId')
  672. if (this.BaseTool.Object.isBlank(sbId)) {
  673. this.$message.error('请先选择设备')
  674. }
  675. this.$refs.partInfoSelectModal.base({ sbId })
  676. },
  677. handlePartSelected(keys, rows) {
  678. const [key] = keys
  679. const [row] = rows
  680. const {
  681. form: { setFieldsValue },
  682. } = this
  683. this.$nextTick(() => {
  684. setFieldsValue(
  685. Object.assign({
  686. part: key,
  687. partName: row.name,
  688. })
  689. )
  690. })
  691. },
  692. handleCheckImgChange(info) {
  693. this.defaultCheckImgList = info.fileList
  694. this.checkImgList = this.setFileList(info, 1)
  695. },
  696. handleCheckFileChange(info) {
  697. this.defaultCheckFileList = info.fileList
  698. this.checkFileList = this.setFileList(info, 2)
  699. },
  700. setFileList(info, type) {
  701. const file = info.file
  702. const fileList = info.fileList
  703. if (file.status === 'done') {
  704. return this.BaseTool.UPLOAD.getUploadFileDTO(fileList, type)
  705. } else if (file.status === 'removed') {
  706. return this.BaseTool.UPLOAD.getUploadFileDTO(fileList, type)
  707. } else if (file.status === 'error') {
  708. this.$message.error('上传失败')
  709. return null
  710. }
  711. },
  712. handleSpareSelect() {
  713. this.$refs.spareSelectModal.base(null, { sbId: this.sbId })
  714. },
  715. handleSpareSelected(record, keys, rows) {
  716. const addData = []
  717. for (let i = 0; i < rows.length; i++) {
  718. addData.push({ sbId: this.sbId, spareId: rows[i].id, spareName: rows[i].name, num: 1 })
  719. }
  720. const { data } = this
  721. for (let i = 0; i < rows.length; i++) {
  722. let find = false
  723. for (let j = 0; j < data.length; j++) {
  724. if (rows[i].spareId === data[j].spareId) {
  725. find = true
  726. break
  727. }
  728. }
  729. if (!find) {
  730. const selectData = {}
  731. selectData.spareId = rows[i].spareId
  732. selectData.spareName = rows[i].name
  733. selectData.ggxh = rows[i].ggxh
  734. selectData.sbId = this.sbId
  735. selectData.bomId = rows[i].id
  736. selectData.num = 1
  737. data.push(selectData)
  738. }
  739. }
  740. },
  741. handleDel() {
  742. const data = [...this.data]
  743. if (this.selectedRowKeys.length === 0) {
  744. this.$message.error('请至少选择一条数据')
  745. return
  746. }
  747. this.data = data.filter((item) => !this.selectedRowKeys.includes(item.bomId))
  748. },
  749. handleDelOne(record) {
  750. const data = [...this.data]
  751. this.data = data.filter((item) => record.bomId !== item.bomId)
  752. },
  753. changeLevel(value) {
  754. this.level = value
  755. // const {
  756. // form: { setFieldsValue }
  757. // } = this
  758. // // 日期处理
  759. // this.$nextTick(() => {
  760. // setFieldsValue({ checkUserType: value })
  761. // })
  762. },
  763. onQuantityChange(e, id, attr) {
  764. const value = e.target.value
  765. console.log(value)
  766. if (value !== 0 && !value) {
  767. return
  768. }
  769. const data = [...this.data]
  770. const target = data.find((item) => item.id === id)
  771. if (target) {
  772. target[attr] = value
  773. this.data = data
  774. }
  775. },
  776. handleSbTypeChange(value) {
  777. this.sbType = value
  778. this.requirementList = this.checkDetailList[value] || []
  779. this.state.selectedRowKeys = this.requirementList ? this.requirementList.map((item) => item.id) : []
  780. this.state.selectedRows = this.requirementList || []
  781. },
  782. handleCheckUserTypeChange(value) {
  783. this.currentCheckUserType = value
  784. },
  785. loadDeptTree() {
  786. if (this.deptTree && this.deptTree.length > 0) return
  787. getDeptTree({}).then((res) => {
  788. this.deptTree = res.data || []
  789. })
  790. },
  791. },
  792. }
  793. </script>