user-edit.vue 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365
  1. <!-- 用户编辑弹窗 -->
  2. <template>
  3. <ele-modal width="960px" :visible="visible" :append-to-body="true" :close-on-click-modal="true"
  4. custom-class="ele-dialog-form" :title="isUpdate ? '修改工序' : '添加工序'" @update:visible="updateVisible">
  5. <header-title title="基本信息"></header-title>
  6. <el-form ref="form" :model="form" :rules="rules" label-width="120px">
  7. <el-row>
  8. <el-col :span="8">
  9. <el-form-item label="工序编码:" prop="code">
  10. <el-input clearable :disabled="isUpdate" v-model="form.code" placeholder="请输入" />
  11. </el-form-item>
  12. </el-col>
  13. <el-col :span="8">
  14. <el-form-item label="工序名称:" prop="name">
  15. <el-input v-model="form.name" clearable placeholder="请输入" />
  16. </el-form-item>
  17. </el-col>
  18. <el-col :span="8">
  19. <el-form-item label="控制码:" prop="controlId">
  20. <el-select v-model="form.controlId" filterable>
  21. <el-option v-for="item in controlList" :key="item.id" :label="item.name" :value="item.id">
  22. </el-option>
  23. </el-select>
  24. </el-form-item>
  25. </el-col>
  26. <el-col :span="8">
  27. <el-form-item label="工作中心:" prop="workCenterName">
  28. <el-input @click.native="chooseWorkCenter" v-model="form.workCenterName" readonly />
  29. </el-form-item>
  30. </el-col>
  31. <el-col :span="8">
  32. <el-form-item label="工序类型:" prop="type">
  33. <el-select v-model="form.type" filterable>
  34. <el-option key="1" label="普通工序" :value="1"> </el-option>
  35. <el-option key="2" label="抽样质检" :value="2"> </el-option>
  36. <el-option key="3" label="普通质检" :value="3"> </el-option>
  37. </el-select>
  38. </el-form-item>
  39. </el-col>
  40. </el-row>
  41. <header-title title="工序节拍时间"></header-title>
  42. <el-row>
  43. <el-col :span="12">
  44. <el-form-item label="节拍生产数量" prop="beatProduceNum">
  45. <el-row>
  46. <el-col :span="16">
  47. <el-input placeholder="请输入" v-model.number="form.workBeat.beatProduceNum">
  48. </el-input></el-col>
  49. <el-col :span="1">&nbsp;</el-col>
  50. <el-col :span="7">
  51. <DictSelection dictName="计量单位" v-model="form.workBeat.beatProduceUnit" />
  52. </el-col>
  53. </el-row>
  54. </el-form-item>
  55. </el-col>
  56. <el-col :span="12">
  57. <el-form-item label="对应物料基本数量" label-width="140px" prop="categoryNum">
  58. <el-row>
  59. <el-col :span="16">
  60. <el-input placeholder="请输入" v-model.number="form.workBeat.categoryNum">
  61. </el-input></el-col>
  62. <el-col :span="1">&nbsp;</el-col>
  63. <el-col :span="7">
  64. <DictSelection dictName="计量单位" v-model="form.workBeat.categoryUnit" />
  65. </el-col>
  66. </el-row>
  67. </el-form-item>
  68. </el-col>
  69. <el-col :span="8">
  70. <el-form-item label="工序休息时长:">
  71. <el-input v-model="form.workBeat.restTimes" placeholder="请输入" />
  72. </el-form-item>
  73. </el-col>
  74. <el-col :span="8">
  75. <el-form-item label="工序准备时长:">
  76. <el-input v-model="form.workBeat.preTimes" clearable placeholder="请输入" />
  77. </el-form-item>
  78. </el-col>
  79. <el-col :span="8">
  80. <el-form-item label="设备生产时长:">
  81. <el-input v-model="form.workBeat.proTimes" placeholder="请输入" />
  82. </el-form-item>
  83. </el-col>
  84. <el-col :span="8">
  85. <el-form-item label="其他时长:">
  86. <el-input placeholder="请输入" v-model="form.workBeat.otherTimes" />
  87. </el-form-item>
  88. </el-col>
  89. <el-col :span="8">
  90. <el-form-item label="节拍时间:">
  91. <el-input disabled :value="totalTime"></el-input>
  92. </el-form-item>
  93. </el-col>
  94. <el-col :span="8">
  95. <el-form-item label="节拍时间单位:" prop="workBeat.beatTimesUnit">
  96. <el-select v-model="form.workBeat.beatTimesUnit">
  97. <el-option v-for="item in timeType2" :key="item.code" :label="item.label" :value="item.code">
  98. </el-option>
  99. </el-select>
  100. </el-form-item>
  101. </el-col>
  102. </el-row>
  103. <header-title title="工序间隔时间"></header-title>
  104. <el-row>
  105. <el-col :span="12">
  106. <el-form-item label="间隔策略:" label-width="200px">
  107. <el-select v-model="form.intervalTime.tactics" filterable>
  108. <el-option v-for="item in tacticsType" :key="item.code" :label="item.label" :value="item.code">
  109. </el-option>
  110. </el-select>
  111. </el-form-item>
  112. </el-col>
  113. <el-col :span="8">
  114. <el-form-item label="间隔时间单位:" prop="timeUnit">
  115. <el-select v-model="form.timeUnit">
  116. <el-option v-for="item in timeType" :key="item.code" :label="item.label" :value="item.code">
  117. </el-option>
  118. </el-select>
  119. </el-form-item>
  120. </el-col>
  121. <el-col :span="12">
  122. <el-form-item label="下工序标准准备时间:" label-width="200px">
  123. <el-input v-model="form.intervalTime.nextStandardPreTime" placeholder="请输入" />
  124. </el-form-item>
  125. </el-col>
  126. <el-col :span="12">
  127. <el-form-item label="下工序最短准备时间:" label-width="200px">
  128. <el-input v-model="form.intervalTime.nextShortPreTime" placeholder="请输入" />
  129. </el-form-item>
  130. </el-col>
  131. <el-col :span="12">
  132. <el-form-item label="本工序标准等待时间:" label-width="200px">
  133. <el-input v-model="form.intervalTime.thisStandardWaitTime" placeholder="请输入" />
  134. </el-form-item>
  135. </el-col>
  136. <el-col :span="12">
  137. <el-form-item label="本工序最短准备时间:" label-width="200px">
  138. <el-input v-model="form.intervalTime.thisShortPreTime" placeholder="请输入" />
  139. </el-form-item>
  140. </el-col>
  141. <el-col :span="12">
  142. <el-form-item label="本工序结束后标准周转时间:" label-width="200px">
  143. <el-input v-model="form.intervalTime.thisStandardBoatTime" placeholder="请输入" />
  144. </el-form-item>
  145. </el-col>
  146. <el-col :span="12">
  147. <el-form-item label="本工序结束后周转最短时间:" label-width="200px">
  148. <el-input v-model="form.intervalTime.thisShortBoatTime" placeholder="请输入" />
  149. </el-form-item>
  150. </el-col>
  151. </el-row>
  152. </el-form>
  153. <template v-slot:footer>
  154. <el-button @click="updateVisible(false)">取消</el-button>
  155. <el-button type="primary" :loading="loading" @click="save">
  156. 保存
  157. </el-button>
  158. </template>
  159. <!-- 工作中心弹窗 -->
  160. <WorkCenter ref="centerRefs" @changeCenter='determineChoose' />
  161. </ele-modal>
  162. </template>
  163. <script>
  164. import producetask from '@/api/technology/production';
  165. import WorkCenter from './WorkCenter.vue';
  166. export default {
  167. components: {
  168. WorkCenter
  169. },
  170. props: {
  171. // 弹窗是否打开
  172. visible: Boolean,
  173. // 修改回显的数据
  174. data: Object,
  175. controlList: Array
  176. },
  177. data() {
  178. const defaultForm = function () {
  179. return {
  180. id: null,
  181. code: '',
  182. name: '',
  183. controlId: '',
  184. type: 1,
  185. workCenterId: '',
  186. workCenterName: '',
  187. timeUnit: '',
  188. intervalTime: {
  189. nextShortPreTime: '', // 时间单位转换后的下一个短周期的时间,格式为YYYY-MM-DDTHH'
  190. nextStandardPreTime: '', // 时间单位转换后的下一个正式的周期的时间,格式为YYYY-MM-DD'
  191. tactics: 1, // 周期工艺描述,格式为JSON字符串或数组形式的对象形式的数据类
  192. thisShortBoatTime: '',
  193. thisShortPreTime: '',
  194. thisStandardBoatTime: '',
  195. thisStandardWaitTime: ''
  196. },
  197. workBeat: {
  198. beatProduceNum: '',
  199. beatProduceUnit: '',
  200. categoryNum: '',
  201. categoryUnit: '',
  202. beatTimes: '',
  203. otherTimes: '',
  204. preTimes: '',
  205. proTimes: '',
  206. restTimes: '',
  207. beatTimesUnit: ''
  208. }
  209. }
  210. }
  211. return {
  212. defaultForm,
  213. // 表单数据
  214. form: defaultForm(),
  215. timeType: [
  216. { code: 1, label: '分' },
  217. { code: 2, label: '时' }
  218. ],
  219. timeType2: [
  220. { code: '1', label: '分' },
  221. { code: '2', label: '时' }
  222. ],
  223. tacticsType: [
  224. { code: 1, label: '标准时间' },
  225. { code: 2, label: '最短时间' }
  226. ],
  227. // 表单验证规则
  228. rules: {
  229. name: [
  230. { required: true, message: '请输入工序名称', trigger: 'blur' }
  231. ],
  232. code: [{ required: true, trigger: 'change', message: '工序编码', }],
  233. controlId: [
  234. { required: true, message: '请选择控制码', trigger: 'blur' }
  235. ],
  236. workCenterName: [
  237. { required: true, message: '请选择工作中心', trigger: 'change' }
  238. ],
  239. 'workBeat.beatTimesUnit': [
  240. { required: true, message: '请选择时间单位', trigger: 'change' }
  241. ],
  242. timeUnit: [
  243. { required: true, message: '请选择间隔时间单位', trigger: 'change' }
  244. ]
  245. },
  246. // 提交状态
  247. loading: false,
  248. // 是否是修改
  249. isUpdate: false,
  250. chooseItem: null,
  251. };
  252. },
  253. computed: {
  254. totalTime() {
  255. let to =
  256. (-this.form.workBeat.restTimes +
  257. -this.form.workBeat.preTimes +
  258. -this.form.workBeat.proTimes +
  259. -this.form.workBeat.otherTimes) *
  260. -1;
  261. return to;
  262. },
  263. // 是否开启响应式布局
  264. styleResponsive() {
  265. return this.$store.state.theme.styleResponsive;
  266. }
  267. },
  268. methods: {
  269. chooseWorkCenter() {
  270. this.$refs.centerRefs.open(this.form)
  271. },
  272. determineChoose(row) {
  273. this.$set(this.form, 'workCenterName', row.name)
  274. this.$set(this.form, 'workCenterId', row.id)
  275. },
  276. /* 保存编辑 */
  277. save() {
  278. this.$refs.form.validate((valid) => {
  279. if (!valid) {
  280. return false;
  281. }
  282. if (!this.isUpdate) {
  283. delete this.form.id;
  284. }
  285. this.form.workBeat.beatTimes = this.totalTime;
  286. this.loading = true;
  287. producetask
  288. .save(this.form)
  289. .then((msg) => {
  290. this.loading = false;
  291. this.$message.success(
  292. (this.isUpdate ? '修改' : '新建') + msg.message
  293. );
  294. this.updateVisible(false);
  295. this.$emit('done');
  296. })
  297. .catch((e) => {
  298. this.loading = false;
  299. // this.$message.error(e.message);
  300. });
  301. });
  302. },
  303. /* 更新visible */
  304. updateVisible(value) {
  305. this.form = { ...this.defaultForm() };
  306. this.$emit('update:visible', value);
  307. }
  308. },
  309. watch: {
  310. async visible(visible) {
  311. if (visible) {
  312. if (this.data) {
  313. const res = await producetask.getById(this.data.id);
  314. this.$util.assignObject(this.form, {
  315. ...res
  316. });
  317. this.isUpdate = true;
  318. } else {
  319. this.form = { ...this.defaultForm() };
  320. this.isUpdate = false;
  321. }
  322. } else {
  323. this.$refs.form.clearValidate();
  324. this.form = { ...this.defaultForm() };
  325. }
  326. }
  327. }
  328. };
  329. </script>