فهرست منبع

转生产计划、创建订单提交

LAPTOP-16IUEB3P\Lenovo 3 سال پیش
والد
کامیت
f375edb334

+ 27 - 9
src/api/saleOrder/index.js

@@ -29,15 +29,15 @@ export async function productionToPlan (data) {
   return Promise.reject(new Error(res.data.message));
 }
 
-// 生产版本列表
-export async function versionPage (params) {
-  let par = new URLSearchParams(params);
-  const res = await request.get( `/main/produceversion/page?` + par );
-  if (res.data.code == 0) {
-    return res.data.data;
-  }
-  return Promise.reject(new Error(res.data.message));
-}
+// // 生产版本列表
+// export async function versionPage (params) {
+//   let par = new URLSearchParams(params);
+//   const res = await request.get( `/main/produceversion/page?` + par );
+//   if (res.data.code == 0) {
+//     return res.data.data;
+//   }
+//   return Promise.reject(new Error(res.data.message));
+// }
 
 // 刷新销售订单 
 export async function pullSalesOrder (params) {
@@ -55,4 +55,22 @@ export async function saveSaleToPlan (data) {
     return res.data.data;
   }
   return Promise.reject(new Error(res.data.message));
+}
+
+//创建更新销售订单 
+export async function createOrUpdate (data) {
+  const res = await request.post( `/aps/salesorder/createOrUpdate`,data );
+  if (res.data.code == 0) {
+    return res.data.data;
+  }
+  return Promise.reject(new Error(res.data.message));
+}
+
+// 获取生产版本 
+export async function getProductVersion (code) {
+  const res = await request.get( `/aps/productionplan/getProductVersion/${code}` );
+  if (res.data.code == 0) {
+    return res.data.data;
+  }
+  return Promise.reject(new Error(res.data.message));
 }

+ 10 - 25
src/components/AssetTree/index.vue

@@ -17,7 +17,7 @@
 </template>
 
 <script>
-  import { getTreeByPid, getTreeByType } from '@/api/classifyManage';
+  import { getTreeByPid } from '@/api/classifyManage';
   // let originId = '';
   // let originType = '';
   export default {
@@ -48,15 +48,6 @@
         type: Boolean,
         default: true
       },
-      // 接口分父级id 和 类型筛选
-      paramsType: {
-        type: String,
-        default: 'id'
-      },
-      type: {
-        type: String,
-        default: ''
-      },
       id: {
         type: String,
         default: '0'
@@ -70,7 +61,7 @@
       //   default: false
       // },
     },
-    data() {
+    data () {
       return {
         treeList: [],
         treeLoading: false,
@@ -79,25 +70,21 @@
         currentKey: ''
       };
     },
-    mounted() {
+    mounted () {
       if (this.init) {
         this.getTreeData();
       }
     },
     methods: {
-      getInstance() {
+      getInstance () {
         return this.$refs.tree;
       },
       // 获取树结构数据
-      async getTreeData() {
+      async getTreeData () {
         try {
           this.treeLoading = true;
-          const requestApi =
-            this.paramsType === 'type'
-              ? getTreeByType.bind(null, this.type)
-              : getTreeByPid.bind(null, this.id);
 
-          const res = await requestApi();
+          const res = await getTreeByPid(this.id);
           this.treeLoading = false;
           if (res?.code === '0') {
             this.treeList = res.data;
@@ -117,9 +104,7 @@
             });
             return this.treeList;
           }
-        } catch (error) {
-          console.log(error);
-        }
+        } catch (error) {}
         this.treeLoading = false;
       },
       // 递归 - 往树children里面添加parentName
@@ -142,17 +127,17 @@
       //   return data;
       // },
 
-      handleNodeClick(data, node) {
+      handleNodeClick (data, node) {
         this.$emit('handleNodeClick', data, node);
       },
       // 设置默认高亮行
-      setCurrentKey(id) {
+      setCurrentKey (id) {
         this.currentKey = id;
         this.$refs.tree.setCurrentKey(this.currentKey);
       },
 
       // 获取树的选中状态
-      getSelectList() {
+      getSelectList () {
         const selectList = this.$refs.tree.getCurrentNode();
         return selectList;
       }

+ 12 - 9
src/components/CreatePlan/ProductionVersion.vue

@@ -11,17 +11,17 @@
 	  ref="tableData"
 	  @row-click="single"
 	>
-	  <el-table-column label="生产版本" align="center" prop="name">
+	  <el-table-column label="生产版本" align="center" prop="produceVersionName">
 	  </el-table-column>
-	  <el-table-column label="未完成工单数量" align="center" prop="num">
+	  <el-table-column label="未完成工单数量" align="center" prop="incompleteOrderNum">
 	  </el-table-column>  
-	  <el-table-column label="未成型数量" align="center" prop="model">
+	  <el-table-column label="未成型数量" align="center" prop="incompleteFormingNum">
 	  </el-table-column>
-	  <el-table-column label="预计完成时间" align="center" prop="model">
+	  <el-table-column label="预计完成时间" align="center" prop="planCompleteDate">
 	  </el-table-column>
 	  <el-table-column label="标准产能" align="center" prop="model">
 	  </el-table-column>
-	  <el-table-column label="原料库存" align="center" prop="model">
+	  <el-table-column label="原料库存" align="center" prop="materialInventory">
 	  </el-table-column>
 	  <el-table-column label="改型仓" align="center" prop="model">
 	  </el-table-column>
@@ -41,14 +41,17 @@
 </template>
 
 <script>
-	import { versionPage  } from '@/api/saleOrder';
+	import { getProductVersion  } from '@/api/saleOrder';
 export default {
+	props: {
+		productCode:String
+	},
     data() {
       return {
         visible: false,
 		tableData:[],
 		loading:false,
-	    radio: '',
+		radio: '',
 		current:null
       };
     },
@@ -62,8 +65,8 @@ export default {
 		this.getPageList()
 	  },
 	  getPageList(){
-		  versionPage({pageNum:1,size:-1}).then(res=>{
-			  this.tableData = res.list
+		  getProductVersion(this.productCode).then(res=>{
+			  this.tableData = res
 		  })
 	  },
       cancel () {

+ 111 - 201
src/views/saleOrder/components/EquipmentDialog.vue

@@ -15,13 +15,13 @@
 			  <el-row>
           <el-col :span="6">
             <el-input
-              v-model="searchKey"
-              placeholder="输入设备编码或名称"
+              v-model="code"
+              placeholder="请输入产品编码"
               size="small"
             ></el-input>
           </el-col>
           <el-col :span="6" style="margin-left:10px">
-             <el-button type="primary" size="small" @click="searchByKeyWords">搜索</el-button>
+             <el-button type="primary" size="small" @click="reload">搜索</el-button>
              <el-button size="small" @click="reset">重置</el-button>
           </el-col>
 			  </el-row>
@@ -30,39 +30,22 @@
         <el-col :span="6" class="tree_col">
           <AssetTree
             @handleNodeClick="handleNodeClick"
-            @setRootId="setRootId"
-            :type="'5'"
+            id="9"
             :paramsType="'type'"
             ref="treeList"
           />
         </el-col>
-        <el-col :span="18" class="table_col">
-          <el-table
-            :data="tableData"
-            height="450"
-            highlight-current-row
-            @current-change="handleCurrentChange"
-          >
-            <el-table-column label="物品编码" prop="code" width="200"></el-table-column>
-            <el-table-column label="物品名称" prop="name"></el-table-column>
-            <el-table-column label="牌号" prop="classificationUrl"></el-table-column>
-            <el-table-column label="型号" prop="specification">>
-            </el-table-column>
-            <el-table-column type='selection' width="55"></el-table-column>
-          </el-table>
-          <div class="pagination">
-            <el-pagination
-              background
-              layout="total, sizes, prev, pager, next, jumper"
-              :total="pagination.total"
-              :page-sizes="[5, 10, 20, 50, 100]"
-              :page-size="pagination.size"
-              :current-page.sync="pagination.page"
-              @current-change="handleCurrent"
-              @size-change="handleSize"
-            >
-            </el-pagination>
-          </div>
+        <el-col :span="18" class="table_col">		
+			<ele-pro-table
+				ref="equiTable"
+				:columns="columns"
+				:datasource="datasource"
+				:selection.sync="selection"
+				cache-key="systemRoleTable"
+				row-key="id"
+				@done="setSelect"
+			>
+			</ele-pro-table>
         </el-col>
       </el-row>
     </div>
@@ -75,196 +58,123 @@
 
 <script>
   import AssetTree from '@/components/AssetTree';
+  import { getList } from '@/api/classifyManage/itemInformation';
 export default {
   components: {
     AssetTree
   },
+  props: {
+  	selectList:Array,
+  },
   data () {
     return {
-      equipmentdialog: false,
-      defaultExpandedKeys: [],
-      tableData: [],
-      currentTreeData: {},
-      params: {},
-      selectedRow: {},
-      pagination: {
-        page: 1,
-        size: 10,
-        total: 0
-      },
-	    searchKey:null,
-      ids:[],
-      treeData:[],
-      requestApi: null,
-	  
-	  current:null,
-	  rootId:null
+      equipmentdialog: false,   
+	  columns: [
+	    {
+	      width: 45,
+	      type: 'selection',
+	      columnKey: 'selection',
+	      align: 'center',
+	  	  reserveSelection: true
+	    },
+	    {
+	      columnKey: 'index',
+	      label: '序号',
+	      type: 'index',
+	      width: 55,
+	      align: 'center',
+	      showOverflowTooltip: true
+	    },
+	    {
+	      prop: 'code',
+	      label: '物品编码',
+	      align: 'center',
+	      showOverflowTooltip: true,
+	      minWidth: 110,
+	      slot: 'code'
+	    },
+	    {
+	      prop: 'name',
+	      label: '物品名称',
+	      align: 'center',
+	      showOverflowTooltip: true,
+	      minWidth: 110
+	    },
+	    {
+	      prop: 'brandNum',
+	      label: '牌号',
+	      align: 'center',
+	      showOverflowTooltip: true,
+	      minWidth: 110
+	    },
+	    {
+	      prop: 'modelType',
+	      label: '型号',
+	      align: 'center',
+	      showOverflowTooltip: true,
+	      minWidth: 110
+	    }
+	  ],
+	  tableList:[],
+	  categoryLevelId:null,	  
+	  code:null,
+	  selection:[]
     }
   },
-  // components: { vTreeList },
+
   watch: {
-    // equipmentdialog (val) {
-    //   if (val) {
-    //     this.$nextTick(() => {
-    //       const treeList = this.$refs.commonTree.treeList
-    //       this.defaultExpandedKeys = [treeList[0].id]
-    //       this.handleNodeClick(treeList[0])
-    //     })
-    //   }
-    // }
+
   },
   methods: {
+	async datasource ({ page, limit }) {
+		 const params = {
+			code:this.code,
+			pageNum: page,
+			size: limit,
+			categoryLevelId: this.categoryLevelId
+		 }
+		const data = await getList(params)
+		this.tableList = data.list
+		return data
+	 },
 	open(){
 		this.equipmentdialog = true
+		this.setSelect()
 	},
-	handleNodeClick (info) {
-	  this.current = info
+	handleNodeClick (data) {
+		this.categoryLevelId = data.id;
+		this.reload();
 	},
-	// 获取根节点id
-	setRootId(id){
-	  this.rootId = id
+	reload () {
+	  this.$refs.equiTable.reload();
 	},
-	
-	
     handleClose () {
       this.equipmentdialog = false
+	  this.$refs.equiTable.clearSelection()
     },
+	reset(){
+		this.code = null
+		this.reload()
+	},
+	// 设置选中
+	setSelect(){
+	   this.$nextTick(() => {
+		   this.tableList.forEach(row => {
+			   this.selectList.forEach(selected => {
+				   if (selected.productCode === row.code) {
+					   this.$refs.equiTable.toggleRowSelection(row, true)
+				   }
+			   })
+		   })
+	   })
+	},
+	// 选择
+	selected(){
+		this.$emit('choose',this.selection)
+		this.handleClose()
+	}
 
-    handleCurrent (page) {
-      this.pagination.page = page
-      this._getList(this.params)
-    },
-    handleSize (size) {
-      this.pagination.page = 1
-      this.pagination.size = size
-      this._getList(this.params)
-    },
-
-    // 树点击事件
-    // handleNodeClick (data, node) {
-    //   // 只点击叶子节点请求表格数据
-    //   if (data.id === this.currentTreeData.id) return
-    //   if(data.children){
-    //      this.ids = []
-    //      this.treeData = []
-    //      this._getTreeDataId(data)
-    //   }else{
-    //     this.ids = [data.id]
-    //   }
-    //   // if (this.currentTreeData.id === data.id || data.children) return
-    //   // this.params = { classificationIdList: [data.id] }
-    //   this.currentTreeData = data
-    //   this.params = { classificationId: parseInt(this.currentTreeData.id)  }
-    //   this._getList(this.params)
-    // },
-
-    // 封装递归获取树id
-    _getTreeDataId (tree) {
-      let data = tree
-      data.children.map(item => {
-        if (item.children) {
-          let tempChildren = []
-          tempChildren = Array.from(item.children)
-          this.treeData.push(data, ...tempChildren)
-        }
-        if (!item.children) {
-          this.treeData.push(data, item)
-        }
-      })
-      for (let i = 0; i < this.treeData.length; i++) {
-        if (this.treeData[i].id) {
-          this.ids.push(this.treeData[i].id)
-        }
-      }
-      this.ids = [...new Set(this.ids)]
-    },
-
-
-    // 封装 - 获取设备列表数据
-     async _getList (params) {
-         const pageParams = {
-           page: this.pagination.page,
-           size: this.pagination.size
-         }
-         let res = await getAssetsList(pageParams, params)
-         // console.log(res)
-         this.tableLoading = false
-         if (res.success) {
-             this.tableData = res.data.records
-             this.pagination.total = res.data.total
-         } else {
-           this.$message.error(res.code)
-         }
-        // switch (this.currentTreeData.parentName) {
-        //   case '生产设备':
-        //     this.requestApi = getList
-        //     break;
-        //   case '舟皿':
-        //     this.requestApi = getBoatList
-        //     break;
-        //   case '周转车':
-        //     this.requestApi = getTurnoverCarList
-        //     break;
-        //   case '模具':
-        //     this.requestApi = getMouldList
-        //     break;
-        // }
-        // this.handleList(params, this.requestApi)
-    },
-
-    async handleList (params, requestApi) {
-      try {
-        const pageParams = {
-          page: this.pagination.page,
-          size: this.pagination.size
-        }
-        let res = await requestApi(pageParams, params)
-        // console.log(res)
-        this.tableLoading = false
-        if (res.success) {
-            this.tableData = res.data.records
-            this.pagination.total = res.data.total
-        } else {
-          this.$message.error(res.code)
-        }
-      } catch (error) {
-        this.tableLoading = false
-      }
-    },
-
-    // 表格选中行
-    handleCurrentChange (row) {
-      if(row){
-        this.selectedRow = row
-        this.selectedRow.equiTypeId = this.currentTreeData.id
-        this.selectedRow.equiTypeName = this.currentTreeData.name
-      }
-    },
 
-    // 选择的设备行
-    selected () {
-      this.selectedRow.parentName = this.currentTreeData.parentName
-      this.$emit('submit', this.selectedRow)
-      this.handleClose()
-    },
-    // 弹窗 - 按关键字搜索
-    searchByKeyWords () {
-      // console.log(this.searchMsg)
-      if(!this.currentTreeData){
-        this.$message.warning('请先选择设备!')
-        return
-      }
-      this.pagination.page = 1
-      this.params = { searchKey: this.searchKey , classificationId: parseInt(this.currentTreeData.id)  }
-      this._getList(this.params)
-    },
-    // 重置
-    reset(){
-       this.pagination.page = 1
-       this.searchKey = ''
-       this.params = { searchKey:this.searchKey , classificationId: parseInt(this.currentTreeData.id) }
-       this._getList(this.params)
-    }
   }
 }
 </script>

+ 100 - 21
src/views/saleOrder/components/create-order.vue

@@ -2,7 +2,7 @@
   <ele-modal
     :visible.sync="visible"
     title="创建订单"
-    width="70vw"
+    width="80vw"
     append-to-body
   >
     <el-form ref="form" :model="form" :rules="rules" label-width="90px">
@@ -20,8 +20,14 @@
 			</el-col>
 			<el-col v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }">
 			  <el-form-item label="订单类型:">
-					<DictSelection dictName="订单类型" clearable v-model="form.orderType">
-					</DictSelection>
+				  <el-select v-model="form.orderType" placeholder="请选择">
+						<el-option
+						  v-for="item in typeList"
+						  :key="item.id"
+						  :label="item.label"
+						  :value="item.id">
+						</el-option>
+				  </el-select>
 			  </el-form-item>
 			</el-col>
 			<el-col v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }">
@@ -44,7 +50,7 @@
 			  <el-form-item label="交付日期:" prop="deliveryTime">
 			    <el-date-picker
 				   style="width: 100%;"
-				   v-model="form.date"
+				   v-model="form.deliveryTime"
 				   type="date"
 				   placeholder="选择日期"
 				   value-format="yyyy-MM-dd">
@@ -66,23 +72,23 @@
 		      <span>{{ scope.$index + 1 }}</span>
 		    </template>
 		  </el-table-column>
-		  <el-table-column label="行号" align="center" prop="name">
+		  <el-table-column label="行号" align="center" prop="lineNumber">
 		  </el-table-column>
-		  <el-table-column label="产品名称" align="center" prop="model">
+		  <el-table-column label="产品名称" align="center" prop="productName">
 		  </el-table-column>
-		  <el-table-column label="产品编号" align="center" prop="model">
+		  <el-table-column label="产品编号" align="center" prop="productCode">
 		  </el-table-column>
-		  <el-table-column label="牌号" align="center" prop="model">
+		  <el-table-column label="牌号" align="center" prop="brandNo">
 		  </el-table-column>
 		  <el-table-column label="型号" align="center" prop="model">
 		  </el-table-column>
-		  <el-table-column label="单重" align="center" prop="model">
+		  <el-table-column label="单重" align="center" prop="productUnitWeight">
 		  </el-table-column>
-		  <el-table-column label="交付数量" align="center" prop="num">
+		  <el-table-column label="交付数量" align="center" prop="contractNum">
 		    <template slot-scope="scope">
 		      <el-form-item
 		          label-width="0px"
-		         :prop="'productInfoAddPos.'+ scope.$index + '.num'"
+		         :prop="'productInfoAddPos.'+ scope.$index + '.contractNum'"
 		         :rules="{
 		           required: true,
 		           message: '请输入交付数量',
@@ -90,16 +96,20 @@
 		         }"
 		       >
 		         <el-input
-		            v-model.number="scope.row.num"
+		            v-model.number="scope.row.contractNum"
 		            size="small"
 		            oninput="value=value.replace(/[^\d]/g,'')"
 		            style="width: 100%"
 		            placeholder="输入数量"
+					@input="inputNumber(scope.row,scope.$index)"
 		          ></el-input>
 		      </el-form-item>
 		    </template>
 		  </el-table-column>
-		  <el-table-column label="交付重量" align="center" prop="measuringUnit">
+		  <el-table-column label="交付重量" align="center" prop="deliveryWeight">
+			  <template slot-scope="{row}">
+			    <span>{{ row.deliveryWeight?row.deliveryWeight:'-' }}</span>
+			  </template>
 		  </el-table-column>
 		  <el-table-column label="操作" align="center" width="70">
 		    <template slot-scope="scope">
@@ -123,13 +133,14 @@
     </template>
 	
 	<!-- 选择产品 -->
-	<EquipmentDialog ref="equipmentRefs"> </EquipmentDialog>
+	<EquipmentDialog ref="equipmentRefs" @choose="confirmChoose" :selectList="form.productInfoAddPos"> </EquipmentDialog>
   </ele-modal>
 </template>
 
 <script>
-	import { getCode } from '@/api/saleOrder'
-	import EquipmentDialog from '../components/EquipmentDialog.vue'
+	import { getCode } from '@/api/codeManagement';
+	import EquipmentDialog from '../components/EquipmentDialog.vue';
+	import { createOrUpdate  } from '@/api/saleOrder';
 	export default {
 		components: {
 		  EquipmentDialog
@@ -145,6 +156,11 @@
 		rules: {
 			deliveryTime: [{required: true,message: '请选择交付日期',trigger: 'change'}]
 		},
+		typeList:[
+			{id:1,label:'内销订单'},
+			{id:2,label:'外销订单'},
+			{id:3,label:'预制订单'}
+		]
       };
     },
     computed: {
@@ -170,6 +186,7 @@
 	  // 删除产品
 	  handleDeleteItem (index) {
 	    this.form.productInfoAddPos.splice(index, 1)
+		this.changeLineNumber()
 	  },
 	  addEquipment(){
 		  this.$refs.equipmentRefs.open()
@@ -180,15 +197,77 @@
 	      if (!valid) {
 	        return false;
 	      }
+		  if(!this.form.productInfoAddPos.length){
+			  return this.$message.warning('产品列表不能为空!')
+		  }
+		  this.loading = true;
+		  createOrUpdate(this.form)
+		    .then((res) => {
+				this.loading = false;
+		        this.$message.success('成功')
+				this.cancel()
+				this.$emit('refresh')
+		    })
+		    .catch((e) => {
+		      this.loading = false;
+		    });
 	    });
 	  },
 	  
-	  async getSaleCode(){
-		const res = await getCode('sale_order')
-		if(res){
-			this.$set(this.form,'code',res)
+		async getSaleCode(){
+		    const res = await getCode('sale_order')
+			if(res){
+				this.$set(this.form,'code',res)
+			}
+		},
+		// 确定选择
+		confirmChoose(list){
+			list = list.map(
+			  (item,index) => {
+			    return {
+			      productCode: item.code,
+			      productName: item.name,
+			      productUnitWeight: item.netWeight,
+			      // id: item.id,
+				  model:item.modelType,
+				  brandNo:item.brandNum
+			    };
+			  }
+			);
+			// 取出在弹窗中选中并且不在表格中的数据
+			 const result = list.filter(
+			   i => this.form.productInfoAddPos.findIndex(p => p.productCode === i.productCode) === -1
+			 )
+			 // 取出在表格中并且不在弹窗中选中的数据 即取消选中的数据
+			 const del = this.form.productInfoAddPos.filter(
+			   i => list.findIndex(p => p.productCode === i.productCode) === -1
+			 )
+			for(let i= this.form.productInfoAddPos.length-1;i>=0;i--){
+			  for(let j in del){
+				  if(this.form.productInfoAddPos[i].productCode === del[j].productCode){
+					  this.form.productInfoAddPos.splice(i,1);
+				  }
+			  }
+			}
+			this.form.productInfoAddPos = this.form.productInfoAddPos.concat(result)
+			this.changeLineNumber()
+		},
+		
+		changeLineNumber(){
+			this.form.productInfoAddPos.map((item,index)=>{
+				item.lineNumber = 10*(index+1)
+			})
+		},
+		
+		inputNumber(row,index){
+			const pos = this.form.productInfoAddPos
+			if(pos[index].productUnitWeight){
+				this.$set(pos[index],'deliveryWeight', row.contractNum * row.productUnitWeight)
+			}
+			// else{
+			// 	this.$set(pos[index],'deliveryWeight','-')
+			// }
 		}
-	  }
 	  
     }
   };

+ 41 - 44
src/views/saleOrder/components/order-search.vue

@@ -80,45 +80,42 @@
 	  		<el-input v-model="where.salesman" placeholder="请输入"></el-input>
 	    </el-form-item>
 	  </el-col>
-<!-- 	  <el-col v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }">
-	    <el-form-item label="组合编码:">
-	  		<el-input v-model="where.ddh" placeholder="请输入"></el-input>
-	    </el-form-item>
-	  </el-col> -->
-	  <el-col v-bind="styleResponsive ? { lg: 12, md: 12 } : { span: 12 }">
-	  		  <el-form-item label="交货日期:">
-	  			<el-date-picker
-	  			    style="width: 100%;"
-	  				v-model="time"
-	  				type="daterange"
-	  				range-separator="至"
-	  				start-placeholder="开始日期"
-	  				end-placeholder="结束日期"
-	  				value-format="yyyy-MM-dd HH:mm:ss"
-	  				:default-time="['00:00:00', '23:59:59']"
-	  				>
-	  			</el-date-picker>
-	  		  </el-form-item>
-	    </el-col>
-      <el-col v-bind="styleResponsive ? { lg: 12, md: 12 } : { span: 12 }">
-		<div class="ele-form-actions">
-			<el-button
-				type="primary"
-				icon="el-icon-search"
-				class="ele-btn-icon"
-				@click="search"
-				size="small"
-			>
-				查询
-			</el-button>
-			 <el-button @click="reset"
-				 icon="el-icon-refresh-left"
-				 size="small"
-				 type="primary"
-			 >重置</el-button>
-		</div>
-      </el-col>
-	  <el-col v-bind="styleResponsive ? { lg: 24, md: 24 } : { span: 24 }">
+    </el-row>
+	<el-row :gutter="15">
+		<el-col v-bind="styleResponsive ? { lg: 12, md: 12 } : { span: 12 }">
+		  <el-form-item label="交货日期:">
+			<el-date-picker
+				style="width: 100%;"
+				v-model="time"
+				type="daterange"
+				range-separator="至"
+				start-placeholder="开始日期"
+				end-placeholder="结束日期"
+				value-format="yyyy-MM-dd HH:mm:ss"
+				:default-time="['00:00:00', '23:59:59']"
+				>
+			</el-date-picker>
+		  </el-form-item>
+		</el-col>
+		<el-col v-bind="styleResponsive ? { lg: 12, md: 12 } : { span: 12 }">
+			<div class="ele-form-actions">
+				<el-button
+					type="primary"
+					icon="el-icon-search"
+					class="ele-btn-icon"
+					@click="search"
+					size="small"
+				>
+					查询
+				</el-button>
+				 <el-button @click="reset"
+					 icon="el-icon-refresh-left"
+					 size="small"
+					 type="primary"
+				 >重置</el-button>
+			</div>
+		</el-col>
+		<el-col v-bind="styleResponsive ? { lg: 24, md: 24 } : { span: 24 }">
 		  <el-form-item label-width="0px">
 			  <el-button @click="goProduct">转生产计划</el-button>
 			  <el-button type="primary" @click="orderRefresh">订单刷新</el-button>
@@ -134,17 +131,17 @@
 				<el-button type="warning">批量导入</el-button>
 			  </el-upload>
 			  <el-button type="info"> 
-			      <a :href="fileUrl" download="销售订单导入模板.xls" class="button-link">下载模板</a>
+				  <a :href="fileUrl" download="销售订单导入模板.xls" class="button-link">下载模板</a>
 			  </el-button>
 			  <el-button type="danger">批量删除</el-button>
-		  </el-form-item>			  
-	  </el-col>
-    </el-row>
+		  </el-form-item>
+		</el-col>
+	</el-row>
 		
 		<!-- 导入异常 -->
 		<import-exception ref="importDialog"> </import-exception>
 		<!-- 创建订单 -->
-		<create-order ref="createDialog"> </create-order>
+		<create-order ref="createDialog" @refresh="search"> </create-order>
 		<!-- 订单组合 -->
 		<group-order ref="groupDialog"> </group-order>
   </el-form>

+ 12 - 2
src/views/saleOrder/components/plan-submit.vue

@@ -37,29 +37,35 @@
 		  </el-descriptions-item>
 		  <el-descriptions-item>
 		  	<template slot="label"> 产品数量 </template>
+			{{info.contractNum}}
 		  </el-descriptions-item>
 		  <el-descriptions-item>
 		  	<template slot="label"> 产品重量 </template>
+			{{info.sumOrderWeight}}
 		  </el-descriptions-item>
 		  <el-descriptions-item>
 		  	<template slot="label"> 要求成型数量 </template>
+			{{info.requiredFormingNum}}
 		  </el-descriptions-item>
 		  <el-descriptions-item>
 		  	<template slot="label"> 要求成型重量 </template>
+			{{info.requiredFormingWeight}}
 		  </el-descriptions-item>
 		  <el-descriptions-item>
 		  	<template slot="label"> 成型完成日期 </template>
+			{{info.reqMoldTime}}
 		  </el-descriptions-item>
 		  <el-descriptions-item :span="3">
 		  	<template slot="label"> 计划备注 </template>
+			{{info.notes}}
 		  </el-descriptions-item>
 		</el-descriptions>
 	</div>
     <div slot="footer" class="footer">
       <div>
         <el-button @click="cancel">取消</el-button>
-		<el-button >提交并发布</el-button>
-		<el-button type="primary">提交</el-button>
+		<el-button  @click="submit(2)">提交并发布</el-button>
+		<el-button type="primary" @click="submit(1)">提交</el-button>
       </div>
     </div>
   </el-dialog>
@@ -97,6 +103,10 @@ export default {
 	  	const code = await getCode('product_code');
 	  	this.$set(this.info, 'code', code);
 	  }, 
+	  submit(type){
+		  this.$emit('publish',type)
+		  this.visible = false;
+	  }
     }
   };
 </script>

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

@@ -11,9 +11,9 @@
         ref="table"
         :columns="columns"
         :datasource="datasource"
-		:selection.sync="selection"
+		    :selection.sync="selection"
         cache-key="systemRoleTable"
-		row-key="id"
+		    row-key="id"
       >
 		<template v-slot:name='{row}'>
 			<el-link :underline="false" @click="openDetails(row)">

+ 73 - 34
src/views/saleOrder/salesToProduction.vue

@@ -25,7 +25,7 @@
 				</el-col>
 				<el-col v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }">
 				  <el-form-item label="产线:">
-				     <el-input v-model="form.productline"></el-input>
+				     <el-input v-model="form.productline" placeholder="选择生产版本带入" readonly></el-input>
 				  </el-form-item>
 				</el-col>
 				<el-col v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }">
@@ -55,7 +55,7 @@
 				</el-col>
 			</el-row>
 			<el-table
-			  :data="form.salesOrderVOS"
+			  :data="form.salesOrders"
 			  border
 			>
 			  <el-table-column label="序号" align="center" width="60">
@@ -77,7 +77,7 @@
 			    <template slot-scope="scope">
 			      <el-form-item
 			          label-width="0px"
-			         :prop="'salesOrderVOS.'+ scope.$index + '.productNum'"
+			         :prop="'salesOrders.'+ scope.$index + '.productNum'"
 			         :rules="{
 			           required: true,
 			           message: '请输入计划生产数',
@@ -99,7 +99,7 @@
 			    <template slot-scope="scope">
 			      <el-form-item
 			          label-width="0px"
-			         :prop="'salesOrderVOS.'+ scope.$index + '.requiredFormingNum'"
+			         :prop="'salesOrders.'+ scope.$index + '.requiredFormingNum'"
 			         :rules="{
 			           required: true,
 			           message: '请输入要求成型数量',
@@ -133,7 +133,7 @@
 				  <template slot-scope="scope">
 				    <el-form-item
 				        label-width="0px"
-				       :prop="'salesOrderVOS.'+ scope.$index + '.reqMoldTime'"
+				       :prop="'salesOrders.'+ scope.$index + '.reqMoldTime'"
 				       :rules="{
 				         required: true,
 				         message: '请选择要求成型日期',
@@ -148,6 +148,13 @@
 				          placeholder="选择日期"
 				          value-format="yyyy-MM-dd">
 				        </el-date-picker>
+					<!-- 	<el-date-picker
+						   style="width: 100%;"
+						   v-model="scope.row.reqMoldTime"
+						   type="datetime"
+						   placeholder="选择日期"
+						   value-format="yyyy-MM-dd HH:mm:ss">
+						 </el-date-picker> -->
 				    </el-form-item>
 				  </template>
 			  </el-table-column>
@@ -189,9 +196,9 @@
 				</el-col>
 			</el-row>
 		</el-form>
-       <AdditionalOrder ref="additionalRefs" :productCode="form.productCode" :selectList="form.salesOrderVOS" @choose="confirmChoose"></AdditionalOrder>
-	   <ProductionVersion ref="versionRefs" @confirm="confirmVersion"></ProductionVersion>
-	   <PlanSubmit ref="submitRefs" :info="form"></PlanSubmit>
+       <AdditionalOrder ref="additionalRefs" :productCode="form.productCode" :selectList="form.salesOrders" @choose="confirmChoose"></AdditionalOrder>
+	   <ProductionVersion ref="versionRefs" @confirm="confirmVersion" :productCode="form.productCode"></ProductionVersion>
+	   <PlanSubmit ref="submitRefs" :info="form" @publish="publishData"></PlanSubmit>
     </el-card>
   </div>
 </template>
@@ -201,7 +208,8 @@
   import ProductionVersion from '@/components/CreatePlan/ProductionVersion.vue'
   import { productionToPlan , saveSaleToPlan  } from '@/api/saleOrder';	
   import dictMixins from '@/mixins/dictMixins';
-  import { deepClone } from '@/utils/index'
+  import { deepClone } from '@/utils/index';
+  import { finishPageTab , reloadPageTab } from '@/utils/page-tab-util';
   export default {
 	mixins: [dictMixins],
     components: {
@@ -213,7 +221,7 @@
       return {
          form:{
 			producteVersionId:'', 
-			salesOrderVOS:[]
+			salesOrders:[]
         },
          // 表单验证规则
 		rules: {
@@ -244,7 +252,7 @@
 	   getSaleInfo(params){
 		    productionToPlan(params).then(res=>{
 				this.form = deepClone(res)
-				this.form.salesOrderVOS.map((item,index)=>{
+				this.form.salesOrders.map((item,index)=>{
 					item.priority = index+1
 				})
 			})
@@ -255,40 +263,64 @@
 	   toSubmit(){
 		   this.$refs.form.validate((valid) => {
 			 if (valid) {
+			   this.mapList() 
 			   this.$refs.submitRefs.open()
 			 }
 		   });
 	   },
+	   // 对比日期,计算要求成型重量
+	   mapList(){
+		   var requiredFormingWeight = 0
+		   var requiredFormingNum = 0
+		   this.form.salesOrders.map((item,index)=>{
+		   		requiredFormingWeight = requiredFormingWeight + Number(item.productUnitWeight) * Number(item.requiredFormingNum)		        
+		        requiredFormingNum = requiredFormingNum + item.requiredFormingNum
+		   })
+		   this.form.requiredFormingWeight = requiredFormingWeight.toFixed(2)
+		   this.form.requiredFormingNum = requiredFormingNum
+		   const collection = deepClone(this.form.salesOrders)
+		   const sortedCollection = collection.sort((a, b) => new Date(b.reqMoldTime) - new Date(a.reqMoldTime));
+		   let latestData = {};
+		   for (let i = 0; i < sortedCollection.length; i++) {
+		     const data = sortedCollection[i];
+		     if (!latestData.reqMoldTime || new Date(data.reqMoldTime) >= new Date(latestData.reqMoldTime)) {
+		       latestData = data;
+		     }
+		   }
+		   this.form.reqMoldTime = latestData.reqMoldTime
+	   },
+
+	   
 	   sortTop (row) {
 	     if (row.priority <= 1) {
 	       return;
 	     }
-	     let rowN = this.form.salesOrderVOS.find((n) => n.priority == row.priority - 1);
+	     let rowN = this.form.salesOrders.find((n) => n.priority == row.priority - 1);
 	     rowN.priority += 1;
 	     row.priority -= 1;
-	     this.form.salesOrderVOS.sort((a, b) => {
+	     this.form.salesOrders.sort((a, b) => {
 	       return a.priority - b.priority;
 	     });
 	   },
 	   sortBottom (row) {
-	     if (row.priority >= this.form.salesOrderVOS.length) {
+	     if (row.priority >= this.form.salesOrders.length) {
 	       return;
 	     }
-	     let rowN = this.form.salesOrderVOS.find((n) => n.priority == row.priority + 1);
+	     let rowN = this.form.salesOrders.find((n) => n.priority == row.priority + 1);
 	     rowN.priority -= 1;
 	     row.priority += 1;
-	     this.form.salesOrderVOS.sort((a, b) => {
+	     this.form.salesOrders.sort((a, b) => {
 	       return a.priority - b.priority;
 	     });
 	   },
 	   againSort () {
-	     this.form.salesOrderVOS.forEach((n, index) => {
+	     this.form.salesOrders.forEach((n, index) => {
 	       n.priority = index + 1;
 	     });
 	   },
 	   // 删除产品
 	   handleDeleteItem (index) {
-	     this.form.salesOrderVOS.splice(index, 1)
+	     this.form.salesOrders.splice(index, 1)
 	   },
 	   addEquipment(){
 		   this.$refs.additionalRefs.open()
@@ -297,45 +329,52 @@
 		  this.$refs.versionRefs.open() 
 	   },
 	   confirmVersion(data){
-		   this.$set(this.form,'producteVersionName',data.name)
-		   this.$set(this.form,'producteVersionId',data.id)
+		   this.$set(this.form,'producteVersionName',data.produceVersionName)
+		   this.$set(this.form,'producteVersionId',data.produceVersionId)
 	   },
 	   
 	   confirmChoose(list){
 		   // 取出在弹窗中选中并且不在表格中的数据
 		   const result = list.filter(
-		     i => this.form.salesOrderVOS.findIndex(p => p.id === i.id) === -1
+		     i => this.form.salesOrders.findIndex(p => p.id === i.id) === -1
 		   )
 		   // 取出在表格中并且不在弹窗中选中的数据 即取消选中的数据
-		   const del = this.form.salesOrderVOS.filter(
+		   const del = this.form.salesOrders.filter(
 		     i => list.findIndex(p => p.id === i.id) === -1
 		   )
-		  for(let i= this.form.salesOrderVOS.length-1;i>=0;i--){
+		  for(let i= this.form.salesOrders.length-1;i>=0;i--){
 			  for(let j in del){
-				  if(this.form.salesOrderVOS[i].id === del[j].id){
-					  this.form.salesOrderVOS.splice(i,1);
+				  if(this.form.salesOrders[i].id === del[j].id){
+					  this.form.salesOrders.splice(i,1);
 				  }
 			  }
 		  }
-		  this.form.salesOrderVOS = this.form.salesOrderVOS.concat(result)
+		  this.form.salesOrders = this.form.salesOrders.concat(result)
 		  this.changeData()
 	   },
 	   changeData(){
 		   var productNum = 0
 		   var productWeight = 0
-		   var requiredFormingNum = 0
-		   // var requiredFormingWeight =  0
-		   // var formingCompletionDate = ''
-		   this.form.salesOrderVOS.map((item,index)=>{
+		   this.form.salesOrders.map((item,index)=>{
 		     	item.priority = index+1
 				productNum = productNum + item.contractNum
 				productWeight = productWeight + Number(item.productSumWeight) 
-				requiredFormingNum = requiredFormingNum + item.requiredFormingNum
-				// requiredFormingWeight = requiredFormingWeight + Number(item.productUnitWeight) * Number(item.requiredFormingNum)
-		   })
-		   this.$set(this.form,'codeNum',this.form.salesOrderVOS.length)
+		  })
+		   this.$set(this.form,'codeNum',this.form.salesOrders.length)
 		   this.$set(this.form,'contractNum',productNum) 
 		   this.$set(this.form,'sumOrderWeight',productWeight.toFixed(2))
+
+	   },
+	   
+	   publishData(type){
+		   console.log('type',type)
+		   let params = deepClone(this.form)
+		   delete params.id
+		   saveSaleToPlan(params).then(res=>{
+			   finishPageTab()
+			   reloadPageTab({ fullPath: '/saleOrder' });
+			   this.$router.go(-1)
+		   }) 
 	   }
     }
   };