Explorar o código

Merge branch 'dev' of http://110.41.163.243:9980/kd-aiot/kd-aiot-frontend-mes into dev

quwangxin %!s(int64=2) %!d(string=hai) anos
pai
achega
452ae60cc0

+ 1 - 0
package.json

@@ -20,6 +20,7 @@
     "core-js": "^3.25.0",
     "countup.js": "^2.3.2",
     "cropperjs": "^1.5.12",
+    "dayjs": "^1.11.9",
     "echarts": "^5.3.3",
     "echarts-wordcloud": "^2.0.0",
     "ele-admin": "^1.11.2",

+ 34 - 0
src/api/operationControl/index.js

@@ -0,0 +1,34 @@
+import request from '@/utils/request';
+
+/**
+ * 信息
+ */
+export async function getInfo (params) {
+  const res = await request.get('/mes/ordercontrol/getInfo');
+  if (res.data.code == 0) {
+    return res.data.data;
+  }
+  return Promise.reject(new Error(res.data.message));
+}
+/**
+ * 保存
+ */
+export async function controlSave (data) {
+  const res = await request.post('/mes/ordercontrol/save', data);
+  if (res.data.code == 0) {
+    return res.data.data;
+  }
+  return Promise.reject(new Error(res.data.message));
+}
+/**
+ * 修改
+ */
+export async function controlUpdate (data) {
+  const res = await request.put('/mes/ordercontrol/update', data);
+  if (res.data.code == 0) {
+    return res.data.data;
+  }
+  return Promise.reject(new Error(res.data.message));
+}
+
+

+ 9 - 0
src/api/produceOrder/index.js

@@ -64,3 +64,12 @@ export async function getById (id) {
   }
   return Promise.reject(new Error(res.data.message));
 }
+
+// 拆分
+export async function splitWork (params) {
+  const res = await request.post(`/mes/workorder/split`,params);
+  if (res.data.code == 0) {
+    return res.data.data;
+  }
+  return Promise.reject(new Error(res.data.message));
+}

+ 0 - 1
src/components/Dict/DictSelection.vue

@@ -1,7 +1,6 @@
 <template>
   <el-select
     v-model="selectVal"
-    size="small"
     style="width: 100%"
     v-bind="$attrs"
     v-on="$listeners"

+ 3 - 2
src/enum/dict.js

@@ -9,6 +9,7 @@ export default {
   网络状态: 'network_status',
   金额单位: 'money_unit',
   仓库: 'warehouse',
-  时间单位: 'time_unit'
+  时间单位: 'time_unit',
+  日期方式: 'date_method'
 };
-export const numberList = [];
+export const numberList = ['date_method'];

+ 144 - 0
src/utils/index.js

@@ -0,0 +1,144 @@
+
+/**
+ * This is just a simple version of deep copy
+ * Has a lot of edge cases bug
+ * If you want to use a perfect deep copy, use lodash's _.cloneDeep
+ * @param {Object} source
+ * @returns {Object}
+ */
+export function deepClone (source) {
+  if (!source && typeof source !== 'object') {
+    throw new Error('error arguments', 'deepClone')
+  }
+  const targetObj = source.constructor === Array ? [] : {}
+  Object.keys(source).forEach(keys => {
+    if (source[keys] && typeof source[keys] === 'object') {
+      targetObj[keys] = deepClone(source[keys])
+    } else {
+      targetObj[keys] = source[keys]
+    }
+  })
+  return targetObj
+}
+
+/**
+ * @description:封装方法:获取今天、昨天、明天
+ * @param {*} dates  0 今天   -1   -2
+ * @returns
+ */
+export function getDay (dates) {
+  var dd = new Date()
+  var n = dates || 0
+  dd.setDate(dd.getDate() + n)
+  var y = dd.getFullYear()
+  var m = dd.getMonth() + 1
+  var d = dd.getDate()
+  m = m < 10 ? '0' + m : m
+  d = d < 10 ? '0' + d : d
+  var day = y + '-' + m + '-' + d
+  return day
+}
+
+/**
+ * @description: 获取某月的起始、结束日期
+ * @param {*} val 年月 2023-01
+ * @returns
+ */
+export function getMonday (val) {
+  let date = new Date(val)
+  let new_year = date.getFullYear() // 取当前的年份
+  let month = date.getMonth()
+  let new_month = month + 1 // 取当前的月份
+  let mon = ''
+  let day = ''
+  if (month > 12) {
+    new_month -= 12 // 月份减
+    new_year++ // 年份增
+  }
+  let firstDay = new Date(new_year, new_month, 1) // 取当年当月中的第一天
+  let lastDay = new Date(firstDay.getTime() - 1000 * 60 * 60 * 24).getDate() // 获取当月最后一天日期
+  if (firstDay.getMonth() < 10) {
+    mon = '0' + firstDay.getMonth()
+  } else {
+    mon = firstDay.getMonth()
+  }
+  if (lastDay < 10) {
+    day = '0' + lastDay
+  } else {
+    day = lastDay
+  }
+  let startDate =
+    firstDay.getFullYear() + '-' + mon + '-' + '0' + firstDay.getDate()
+  let endDate = firstDay.getFullYear() + '-' + mon + '-' + day
+  let dateRange = [startDate, endDate]
+  return dateRange
+}
+
+/**
+ * @description: 获取本周起始日期
+ * @param {*} type s 周开始  e周结束
+ * @param {*} dates  0 本周
+ * @returns
+ */
+export function getDate (type, dates = 0) {
+  var now = new Date()
+  var nowTime = now.getTime()
+  var day = now.getDay()
+  var longTime = 24 * 60 * 60 * 1000
+  var n = longTime * 7 * (dates || 0)
+  if (type == 's') {
+    var dd = nowTime - (day - 1) * longTime + n
+  }
+  if (type == 'e') {
+    var dd = nowTime + (7 - day) * longTime + n
+  }
+  dd = new Date(dd)
+  var y = dd.getFullYear()
+  var m = dd.getMonth() + 1
+  var d = dd.getDate()
+  m = m < 10 ? '0' + m : m
+  d = d < 10 ? '0' + d : d
+  var day = y + '-' + m + '-' + d
+  return day
+}
+
+/**
+ * @description 获取最近 7天日期
+ * @returns days
+ */
+export function getRecent7Days () {
+  let days = []
+  for (let i = 0; i <= 24 * 6; i += 24) {
+    // 使用当天时间戳减去以前的时间毫秒(小时 * 分 * 秒 * 毫秒)
+    let dateItem = new Date(Date.now() - i * 60 * 60 * 1000)
+    let y = dateItem.getFullYear()
+    let m = dateItem.getMonth() + 1
+    let d = dateItem.getDate()
+    m = addDate0(m)
+    d = addDate0(d)
+    let valueItem = y + '-' + m + '-' + d
+    days.push(valueItem)
+  }
+  return days
+}
+// 给日期拼接 0
+function addDate0 (time) {
+  if (time.toString().length === 1) {
+    time = '0' + time.toString()
+  }
+  return time
+}
+
+//补零 000
+export function pushZero (num) {
+  let count = 3 - String(num).length
+  if (count > 0) {
+    return new Array(count).fill('0').join('') + num
+  }
+  return num
+}
+
+//表格分页 序号连续
+export function tableIndex (index, page, size) {
+  return index + 1 + size * (page - 1)
+}

+ 159 - 0
src/views/operationControl/index.vue

@@ -0,0 +1,159 @@
+<template>
+  <div class="ele-body">
+    <el-card shadow="never" v-loading="loading">
+		<div class="form-wrapper">
+		  <el-form
+		    :model="formData"
+		    label-width="0"
+		    :show-message="false"
+		    ref="formRef"
+		  >
+		    <el-descriptions title="" :column="1" border>
+		      <el-descriptions-item
+		        label="日期方式"
+		      >
+					<span slot="label" class="label-required">日期方式</span>
+					<el-form-item prop="formingNum">
+						<DictSelection
+							dictName="日期方式"
+							clearable
+							v-model="formData.dateType"
+							@change="changeType"
+						>
+						</DictSelection>
+					</el-form-item>
+		      </el-descriptions-item>
+		      <el-descriptions-item
+		        label=""
+				v-if="formData.dateType==2"
+		      >
+		        <span slot="label" class="label-required"></span>
+		        <el-form-item prop="appointTime" class="w100">
+		          <el-date-picker
+		            class="w100"
+		            v-model="formData.appointTime"
+		            type="datetime"
+		            value-format="yyyy-MM-dd HH:mm:ss"
+		          ></el-date-picker> </el-form-item
+		      ></el-descriptions-item>
+			  <el-descriptions-item
+			    label="关闭工单"
+			  >
+					<span slot="label" class="label-required">关闭工单</span>
+					<el-form-item prop="orderClose">
+						  <el-radio v-model="formData.orderClose" :label="1">启用</el-radio>
+						  <el-radio v-model="formData.orderClose" :label="0">禁用</el-radio>
+					</el-form-item>
+			  </el-descriptions-item>
+			  <el-descriptions-item
+			    label="报工操作"
+			  >
+					<span slot="label" class="label-required">报工操作</span>
+					<el-form-item prop="reportWork">
+						  <el-radio v-model="formData.reportWork" :label="1">启用</el-radio>
+						  <el-radio v-model="formData.reportWork" :label="0">禁用</el-radio>
+					</el-form-item>
+			  </el-descriptions-item>
+			  <el-descriptions-item
+			    label="货物移动"
+			  >
+					<span slot="label" class="label-required">货物移动</span>
+					<el-form-item prop="goodsMovement">
+						  <el-radio v-model="formData.goodsMovement" :label="1">启用</el-radio>
+						  <el-radio v-model="formData.goodsMovement" :label="0">禁用</el-radio>
+					</el-form-item>
+			  </el-descriptions-item>
+		    </el-descriptions>
+		  </el-form>
+		  <div class="footer">
+		    <el-button type="primary" @click="confirm" :loading="saveLoading">保存</el-button>
+		  </div>
+		</div>
+    </el-card>
+  </div>
+</template>
+
+<script>
+  import dictMixins from '@/mixins/dictMixins';
+  import dayjs from 'dayjs';
+  import {
+    getInfo,
+    controlSave,
+    controlUpdate
+  } from '@/api/operationControl/index.js';
+  export default {
+	mixins: [dictMixins],
+    data () {
+      return {
+		  // 加载状态
+		  loading: false,
+		  formData:{
+			  dateType:1,
+			  orderClose:1,
+			  reportWork:1,
+			  goodsMovement:1,
+			  appointTime:''
+		  },
+		  fnType:1,
+		  saveLoading:false
+      };
+    },
+    computed: {
+    },
+	async created() {
+		this.getInfoData()
+	},
+    methods: {
+		changeType(val){
+			if(val==2){
+				const time = dayjs( new Date().getTime() ).format('YYYY-MM-DD HH:mm:ss');
+				this.$set(this.formData,'appointTime',time)
+			}
+		},
+		async getInfoData(){
+			const res = await getInfo()
+			if(typeof res == 'string'){
+				this.fnType = 1
+			}else{
+				this.formData = res
+				this.fnType = 2
+			}
+		},
+		confirm(){
+			const saveOrUpdate = this.fnType == 1?controlSave:controlUpdate
+			if(this.formData.dateType==1){
+				delete this.formData.appointTime
+			}
+			this.saveLoading = true
+			saveOrUpdate(this.formData).then(res=>{
+				this.$message.success('保存成功');
+				this.saveLoading = false
+				this.getInfoData()
+			}).catch(()=>{
+				this.saveLoading = false
+			})
+		}
+     
+    }
+  };
+</script>
+
+<style lang="scss" scoped>
+	.form-wrapper{
+		width: 40%;
+		margin: 10px auto;
+		.el-form-item{
+			margin-bottom: 0;
+		}
+		.w100{
+			width: 100%!important;
+		}
+		.footer{
+			width: 100%;
+			margin: 20px auto 0;
+			display: flex;
+			align-items: center;
+			justify-content: flex-end;
+		}
+	}
+</style>

+ 57 - 36
src/views/produceOrder/components/unpackDialog.vue

@@ -12,6 +12,7 @@
         label-width="0"
         :show-message="false"
         ref="formRef"
+		:rules="rules"
       >
         <el-descriptions title="" :column="2" border>
           <el-descriptions-item label="工单号">
@@ -38,8 +39,8 @@
             content-class-name="produce-create-bg"
           >
             <span slot="label" class="label-required">成型数量</span>
-            <el-form-item prop="formingNum" required>
-              <el-input v-model="requestData.formingNum"></el-input>
+            <el-form-item prop="formingNum">
+              <el-input type="number" v-model="requestData.formingNum" @input="changeNumber"></el-input>
             </el-form-item>
           </el-descriptions-item>
           <el-descriptions-item
@@ -48,8 +49,7 @@
             content-class-name="produce-create-bg"
           >
             <span slot="label" class="label-required">计划开始时间</span>
-
-            <el-form-item prop="planStartTime" required class="w100">
+            <el-form-item prop="planStartTime" class="w100">
               <el-date-picker
                 class="w100"
                 v-model="requestData.planStartTime"
@@ -63,7 +63,7 @@
             content-class-name="produce-create-bg"
           >
             <span slot="label" class="label-required">设备编码/名称</span>
-            <el-form-item prop="deviceName" required
+            <el-form-item prop="deviceName"
               ><el-input
                 @click.native="getEquip"
                 :value="
@@ -87,8 +87,10 @@
 </template>
 
 <script>
-  import { save, update } from '@/api/produceOrder/index.js';
+  import { splitWork } from '@/api/produceOrder/index.js';
   import equipmentDailog from '@/components/EquipmentDailog/equipment-dailog';
+  import { positiveIntegerReg } from 'ele-admin';
+  import { deepClone } from '@/utils';
   export default {
     components: { equipmentDailog },
     data () {
@@ -96,42 +98,49 @@
         visible: false,
         produceVersionId: '',
         formData: {},
-		requestData:{}
+		requestData:{
+			deviceCode: '',
+			deviceName: '',
+			deviceId:''
+		},
+		formingNum:0,
+		rules:{
+			formingNum: [
+				{ required: true, message: '请输入成型数量', trigger: 'blur' },
+				{ pattern: positiveIntegerReg, message: '成型数量格式不正确', trigger: 'blur' }
+			],
+			planStartTime:[
+				{ required: true, message: '请选择计划开始时间', trigger: 'change' }
+			],
+			deviceName:[
+				{ required: true, message: '请选择设备', trigger: 'change' }
+			]
+		}
       };
     },
     methods: {
       open (row) {
         this.visible = true;
-		this.formData = row
-		this.produceVersionId = row.produceVersionId
-		if(row.planStartTime){
-			this.requestData.planStartTime = row.planStartTime
+		this.formData = deepClone(row)
+		this.formingNum = this.formData.formingNum
+		this.produceVersionId = this.formData.produceVersionId
+		if(this.formData.planStartTime){
+			this.$set(this.requestData,'planStartTime',this.formData.planStartTime)
 		}
       },
-      // codeChoose () {
-      //   this.$refs.apsPlanOrderRef.open(this.formData.productCode, (res) => {
-      //     if (this.formData.productCode != res.productCode) {
-      //       this.formData.deviceCode = '';
-      //       this.formData.deviceName = '';
-      //       this.formData.deviceId = '';
-      //     }
-      //     this.formData.productionPlanCode = res.code;
-      //     this.formData.productionPlanId = res.id;
-      //     this.formData.productCode = res.productCode;
-      //     this.formData.productName = res.productName;
-      //     this.formData.brandNo = res.brandNo;
-      //     this.formData.model = res.model;
-      //     this.formData.productNum = res.productNum;
-      //     this.formData.requiredFormingNum = res.requiredFormingNum;
-      //     this.produceVersionId = res.produceVersionId;
-      //   });
-      // },
+	  
+	  changeNumber(val){
+		  if(!positiveIntegerReg.test(this.requestData.formingNum)){
+		   	return this.$message.warning('成型数量应为正整数'); 
+		  }
+		  if(val>this.formingNum||val==this.formingNum){
+			  return this.$message.warning('成型数量应小于要求成型数量');
+		  }
+		  this.formData.formingNum = this.formingNum - val
+	  },
       getEquip () {
-        // if (!this.produceVersionId) {
-        //   return this.$message.error('请先选择计划');
-        // }
         this.$refs.equipmentDailogRef.openSingle(
-          [this.requestData.deviceCode],
+          [this.requestData],
           (res) => {
             this.requestData.deviceCode = res.code;
             this.requestData.deviceName = res.name;
@@ -141,14 +150,26 @@
       },
       cancel () {
         this.formData = {};
-		this.requestData = {};
+		this.requestData = {
+			deviceCode: '',
+			deviceName: '',
+			deviceId:''
+		};
         this.visible = false;
+		this.$refs.formRef.resetFields();
       },
       confirm () {
+		  if(!positiveIntegerReg.test(this.requestData.formingNum)){
+		   	return this.$message.warning('成型数量应为正整数'); 
+		  }
         this.$refs.formRef.validate(async (value) => {
           if (value) {
-            const res = await save(this.requestData);
-            this.$message.success('操作成功!');
+			  const params = {
+				  ...this.requestData,
+				  originalCode:this.formData.code
+			  }
+            const res = await splitWork(params);
+            this.$message.success('拆分成功!');
             this.$emit('success');
             this.cancel();
           }

+ 2 - 2
src/views/produceOrder/index.vue

@@ -24,11 +24,11 @@
         :selection.sync="selection"
       >
         <template v-slot:toolbar>
-          <el-button type="primary">工单刷新</el-button>
+          <!-- <el-button type="primary">工单刷新</el-button> -->
           <el-button type="success" @click="handlePicking">领料</el-button>
           <el-button type="success" @click="toEnd()">批量完结</el-button>
           <el-button type="success" @click="handleCreate">创建工单</el-button>
-          <el-button type="success">工单操作控制</el-button>
+          <!-- <el-button type="success">工单操作控制</el-button> -->
         </template>
         <template v-slot:code="{ row }">
           <el-link type="primary" :underline="false" @click="goDetail(row)">