UpkeepPlanForm.vue 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409
  1. <template>
  2. <a-spin :spinning="confirmLoading">
  3. <j-form-container :disabled="formDisabled">
  4. <a-form-model ref="form" :model="model" :rules="validatorRules" slot="detail">
  5. <div class="cmms-dialog-item-title">保养计划基本信息</div>
  6. <div style="height: 100%;width:100%;display: flex;">
  7. <div style="height: 100%;width:92%;">
  8. <a-row>
  9. <!-- <a-col :span="12">
  10. <a-form-model-item label="保养计划编号" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="plancode">
  11. <a-input v-model="model.plancode" placeholder="请输入保养计划编号" ></a-input>
  12. </a-form-model-item>
  13. </a-col> -->
  14. <a-col :span="12">
  15. <a-form-model-item label="计划名称" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="planname">
  16. <a-input v-model="model.planname" placeholder="请输入计划名称" ></a-input>
  17. </a-form-model-item>
  18. </a-col>
  19. <a-col :span="12">
  20. <a-form-model-item label="选择设备" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="equipmentid">
  21. <!-- <j-search-select-tag v-model="model.equipmentid" dict="tpm_equipment,equipmentname,id" :disabled="disabledEdit" style="width: 100%"/> -->
  22. <a-select
  23. v-model="model.equipmentid"
  24. placeholder="请输入设备名称或设备编号"
  25. show-search
  26. :disabled="disabledEdit"
  27. :filterOption="filterOptions"
  28. @search="searchDevice"
  29. allowClear>
  30. <a-select-option v-for="(item, index) in deviceOptions" :key="index" :value="item.id" :label="item.equipmentname">
  31. <span>{{item.equipmentname}}</span>
  32. <span style="position: absolute;right: 2%;">{{ item.equipmentcode }}</span>
  33. </a-select-option>
  34. </a-select>
  35. <!-- <a-button type="primary" icon="search" /> -->
  36. </a-form-model-item>
  37. </a-col>
  38. <!-- <a-col :span="12">
  39. <a-form-model-item label="保养工作项目ID" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="upkeepprojid">
  40. <a-input v-model="model.upkeepprojid" placeholder="请输入保养工作项目ID" ></a-input>
  41. </a-form-model-item>
  42. </a-col>
  43. <a-col :span="12">
  44. <a-form-model-item label="工作项目名称" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="projectname">
  45. <a-input v-model="model.projectname" placeholder="请输入工作项目名称" ></a-input>
  46. </a-form-model-item>
  47. </a-col>
  48. <a-col :span="12">
  49. <a-form-model-item label="厂商名称" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="supplier">
  50. <a-input v-model="model.supplier" placeholder="请输入厂商名称" ></a-input>
  51. </a-form-model-item>
  52. </a-col>
  53. <a-col :span="12">
  54. <a-form-model-item label="厂商电话" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="suppliertel">
  55. <a-input v-model="model.suppliertel" placeholder="请输入厂商电话" ></a-input>
  56. </a-form-model-item>
  57. </a-col>
  58. <a-col :span="12">
  59. <a-form-model-item label="联系人" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="linker">
  60. <a-input v-model="model.linker" placeholder="请输入联系人" ></a-input>
  61. </a-form-model-item>
  62. </a-col>
  63. <a-col :span="12">
  64. <a-form-model-item label="联系人电话" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="linkertel">
  65. <a-input v-model="model.linkertel" placeholder="请输入联系人电话" ></a-input>
  66. </a-form-model-item>
  67. </a-col>
  68. <a-col :span="12">
  69. <a-form-model-item label="描述" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="plandesc">
  70. <a-input v-model="model.plandesc" placeholder="请输入描述" ></a-input>
  71. </a-form-model-item>
  72. </a-col> -->
  73. <a-col :span="12">
  74. <a-form-model-item label="地点" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="address">
  75. <a-input v-model="model.address" placeholder="请输入地点" ></a-input>
  76. </a-form-model-item>
  77. </a-col>
  78. <a-col :span="12">
  79. <a-form-model-item label="负责人" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="chargeruser">
  80. <j-dict-select-tag v-model="model.chargeruser" placeholder="请选择负责人" dictCode="sys_user,realname,id"/>
  81. </a-form-model-item>
  82. </a-col>
  83. <a-col :span="12">
  84. <a-form-model-item label="开始时间" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="begintime">
  85. <j-date placeholder="请选择开始时间" v-model="model.begintime" style="width: 100%" :show-time="true" date-format="YYYY-MM-DD HH:mm:ss"/>
  86. </a-form-model-item>
  87. </a-col>
  88. <a-col :span="12">
  89. <a-form-model-item label="提前通知" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="noticenum">
  90. <a-input-number v-model="model.noticenum" :min="1" placeholder="请输入提前通知时长" style="width: 40%" />
  91. <j-dict-select-tag v-model="model.noticetype" placeholder="时长单位" dictCode="plan_notice_unit" style="width: 30%"/>
  92. </a-form-model-item>
  93. </a-col>
  94. <!-- <a-col :span="12">
  95. <a-form-model-item label="通知单位" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="noticetype">
  96. <j-dict-select-tag v-model="model.noticetype" placeholder="请选择通知单位" dictCode="plan_notice_unit"/>
  97. </a-form-model-item>
  98. </a-col> -->
  99. <a-col :span="12">
  100. <a-form-model-item label="重复间隔" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="repeatnum">
  101. <a-input-number v-model="model.repeatnum" :min="1" placeholder="请输入重复间隔" style="width: 40%" />
  102. <j-dict-select-tag v-model="model.repeattype" placeholder="间隔单位" dictCode="plan_cycle_unit" style="width: 30%" />
  103. </a-form-model-item>
  104. </a-col>
  105. <!-- <a-col :span="12">
  106. <a-form-model-item label="间隔单位" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="repeattype">
  107. <j-dict-select-tag v-model="model.repeattype" placeholder="请选择间隔单位" dictCode="plan_cycle_unit"/>
  108. </a-form-model-item>
  109. </a-col> -->
  110. <!-- <a-col :span="12">
  111. <a-form-model-item label="状态" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="status">
  112. <a-input v-model="model.status" placeholder="请输入状态(0启用 1停用)" ></a-input>
  113. </a-form-model-item>
  114. </a-col> -->
  115. <!-- <a-col :span="12">
  116. <a-form-model-item label="下次执行时间" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="nexttime">
  117. <j-date placeholder="请选择下次执行时间" v-model="model.nexttime" style="width: 100%" />
  118. </a-form-model-item>
  119. </a-col>
  120. <a-col :span="12">
  121. <a-form-model-item label="下次通知时间" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="noticetime">
  122. <j-date placeholder="请选择下次通知时间" v-model="model.noticetime" style="width: 100%" />
  123. </a-form-model-item>
  124. </a-col> -->
  125. <!-- <a-col :span="12">
  126. <a-form-model-item label="是否已通知:是/否" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="ifnotice">
  127. <a-input v-model="model.ifnotice" placeholder="请输入是否已通知:是/否" ></a-input>
  128. </a-form-model-item>
  129. </a-col> -->
  130. <a-col :span="12">
  131. <a-form-model-item label="备注" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="remark">
  132. <a-textarea v-model="model.remark" placeholder="请输入备注" :auto-size="{ minRows: 2, maxRows: 2 }"></a-textarea>
  133. </a-form-model-item>
  134. </a-col>
  135. </a-row>
  136. </div>
  137. <div style="height: 100%;width:8%;padding-top:0.25%;">
  138. <a-button type="primary" icon="search" />
  139. </div>
  140. </div>
  141. <div class="cmms-dialog-item-title u-flex-jab">
  142. <div>设备保养设置</div>
  143. <div>
  144. <a-button @click="handleAddUpkeepItem" type="link" icon="plus">保养项</a-button>
  145. </div>
  146. </div>
  147. <a-table
  148. ref="table"
  149. size="middle"
  150. :scroll="{x:true}"
  151. bordered
  152. rowKey="id"
  153. :columns="columns"
  154. :dataSource="model.cmmsUpkeepItemDtoList"
  155. :pagination="false"
  156. class="j-table-force-nowrap">
  157. </a-table>
  158. <upkeep-plan-modal-add ref="modalForm" @ok="modalFormOk" :modelForm="model" :dataList="model.cmmsUpkeepItemDtoList" @customEvent="handleCustomEvent"></upkeep-plan-modal-add>
  159. </a-form-model>
  160. </j-form-container>
  161. </a-spin>
  162. </template>
  163. <script>
  164. import { httpAction, getAction } from '@/api/manage'
  165. import { validateDuplicateValue } from '@/utils/util'
  166. import { mixinDevice } from '@/utils/mixin'
  167. import { JeecgListMixin } from '@/mixins/JeecgListMixin'
  168. import UpkeepPlanModalAdd from './UpkeepPlanModalAdd.vue'
  169. export default {
  170. name: 'UpkeepPlanForm',
  171. mixins:[JeecgListMixin, mixinDevice],
  172. components: {
  173. UpkeepPlanModalAdd
  174. },
  175. props: {
  176. //表单禁用
  177. disabled: {
  178. type: Boolean,
  179. default: false,
  180. required: false
  181. }
  182. },
  183. data () {
  184. return {
  185. model:{
  186. noticetype: '天',
  187. repeattype: '天',
  188. cmmsUpkeepItemDtoList: []
  189. },
  190. labelCol: {
  191. xs: { span: 24 },
  192. sm: { span: 6 },
  193. },
  194. wrapperCol: {
  195. xs: { span: 24 },
  196. sm: { span: 18 },
  197. },
  198. disabledEdit: false,
  199. confirmLoading: false,
  200. validatorRules: {
  201. planname: [
  202. { required: true, message: '请输入保养计划名称!'},
  203. ],
  204. equipmentid: [
  205. { required: true, message: '请选择设备!'},
  206. ],
  207. address: [
  208. { required: true, message: '请输入地点!'},
  209. ],
  210. chargeruser: [
  211. { required: true, message: '请输入负责人!'},
  212. ],
  213. begintime: [
  214. { required: true, message: '请选择开始时间!'},
  215. ],
  216. noticenum: [
  217. { required: true, message: '请输入提前通知时长!'},
  218. ],
  219. repeatnum: [
  220. { required: true, message: '请输入重复间隔!'},
  221. ],
  222. },
  223. url: {
  224. list: "/cmmsSpotcheckItem/cmmsSpotcheckItem/listbyequipmentid/{equipmentid}",
  225. add: "/cmmsUpkeepPlan/cmmsUpkeepPlan/add",
  226. edit: "/cmmsUpkeepPlan/cmmsUpkeepPlan/edit",
  227. queryById: "/cmmsUpkeepPlan/cmmsUpkeepPlan/queryById"
  228. },
  229. columns: [
  230. // {
  231. // title:'保养项ID',
  232. // align:"center",
  233. // dataIndex: 'id'
  234. // },
  235. {
  236. title:'保养项编号',
  237. align:"center",
  238. dataIndex: 'itemcode'
  239. },
  240. {
  241. title:'保养项名称',
  242. align:"center",
  243. dataIndex: 'itemname'
  244. },
  245. // {
  246. // title:'设备类型',
  247. // align:"center",
  248. // dataIndex: 'equiptypeName'
  249. // },
  250. {
  251. title:'保养项标准',
  252. align:"center",
  253. dataIndex: 'itemcontent'
  254. },
  255. {
  256. title:'备注',
  257. align:"center",
  258. dataIndex: 'remark'
  259. },
  260. ],
  261. deviceOptions: [],
  262. deviceOptionsAll: [],
  263. }
  264. },
  265. computed: {
  266. formDisabled(){
  267. return this.disabled
  268. },
  269. },
  270. created () {
  271. //备份model原始值
  272. this.modelDefault = JSON.parse(JSON.stringify(this.model));
  273. this.getDeviceOption();
  274. },
  275. methods: {
  276. // 获取设备下拉列表
  277. getDeviceOption(){
  278. getAction(`/tpmEquipment/tpmEquipment/selectEquipmentList`).then(res=>{
  279. console.log(111,res.result)
  280. this.deviceOptions = res.result.map((res) => {
  281. return {
  282. id: res.id,
  283. equipmentname: res.equipmentname,
  284. equipmentcode: res.equipmentcode,
  285. }
  286. })
  287. // 存一个完整的设备表
  288. this.deviceOptionsAll = this.deviceOptions
  289. console.log(7878,this.deviceOptionsAll)
  290. })
  291. },
  292. // 筛选设备
  293. searchDevice(value) {
  294. console.log(1212,value,value.trim().length)
  295. // 若输入的值删除,则重新赋完整的设备列表
  296. if (value.trim().length === 0) {
  297. this.deviceOptions = this.deviceOptionsAll
  298. }
  299. // 通过判断字符串中是数字还是文字进而判断是通过设备名筛选还是设备编号筛选
  300. let panDuan = isNaN(parseFloat(value))
  301. if (!panDuan) {
  302. // 数字
  303. console.log(777)
  304. let filteredArray = this.deviceOptionsAll.filter(item => item.equipmentcode.includes(value));
  305. this.deviceOptions = filteredArray
  306. } else {
  307. console.log(888)
  308. let filteredArray = this.deviceOptionsAll.filter(item => item.equipmentname.includes(value));
  309. this.deviceOptions = filteredArray
  310. }
  311. console.log(999,this.deviceOptions)
  312. },
  313. // 解决筛选后option不回显问题
  314. filterOptions(input, option) {
  315. return this.deviceOptions
  316. },
  317. add () {
  318. // this.edit(this.modelDefault);
  319. this.model = Object.assign({}, this.modelDefault);
  320. this.visible = true;
  321. },
  322. edit (record) {
  323. // this.model = Object.assign({}, record);
  324. this.disabledEdit = true
  325. getAction(this.url.queryById, record).then((res) => {
  326. console.log(88,res)
  327. this.model = res.result
  328. // this.model.cmmsUpkeepItemDtoList = this.model.cmmsUpkeepItemDtoList.map((res) => {
  329. // return {
  330. // id: id,
  331. // itemcode: res.itemcode,
  332. // itemname: res.itemname,
  333. // itemcontent: res.itemcontent,
  334. // remark: res.remark
  335. // }
  336. // })
  337. })
  338. this.visible = true;
  339. },
  340. submitForm () {
  341. const that = this;
  342. // 触发表单验证
  343. this.$refs.form.validate(valid => {
  344. if (valid) {
  345. that.confirmLoading = true;
  346. let httpurl = '';
  347. let method = '';
  348. if(!this.model.id){
  349. httpurl+=this.url.add;
  350. method = 'post';
  351. // 默认状态是禁用
  352. this.model.status = 1
  353. this.model.cmmsUpkeepItemDtoList = this.model.cmmsUpkeepItemDtoList.map((res) => {
  354. return {
  355. id: res.id
  356. }
  357. })
  358. }else{
  359. httpurl+=this.url.edit;
  360. method = 'put';
  361. this.model.cmmsUpkeepItemDtoList = this.model.cmmsUpkeepItemDtoList.map((res) => {
  362. return {
  363. id: res.id
  364. }
  365. })
  366. }
  367. console.log(999,this.model)
  368. httpAction(httpurl,this.model,method).then((res)=>{
  369. if(res.success){
  370. that.$message.success(res.message);
  371. that.$emit('ok');
  372. }else{
  373. that.$message.warning(res.message);
  374. }
  375. }).finally(() => {
  376. that.confirmLoading = false;
  377. })
  378. }
  379. })
  380. },
  381. // 通过已选设备获取保养项列表
  382. handleAddUpkeepItem(){
  383. console.log(this.model.equipmentid)
  384. if (this.model.equipmentid == undefined) {
  385. this.$message.error("请先选择设备!");
  386. } else {
  387. this.$refs.modalForm.add();
  388. this.$refs.modalForm.title = "选择保养项";
  389. }
  390. },
  391. // 处理子组件传过来的数据
  392. handleCustomEvent(data) {
  393. // 处理从子组件传递过来的数据
  394. console.log("子组件传过来的数据:", data);
  395. this.model.cmmsUpkeepItemDtoList = data;
  396. }
  397. }
  398. }
  399. </script>
  400. <style scoped>
  401. @import "~@/assets/less/uStyle.less";
  402. </style>