wenningning 6 bulan lalu
induk
melakukan
a8a2019ba0

+ 18 - 0
manager-admin/src/api/pjOrderItems.js

@@ -58,3 +58,21 @@ export function deletes(ids) {
     loading: true
   })
 }
+
+export function getPageList(params) {
+  return request({
+    url: 'pjorder_items/pageList',
+    method: 'post',
+    loading: true,
+    data: params
+  })
+}
+
+export function getPageGroupList(params) {
+  return request({
+    url: 'pjorder_items/getPageGroupList',
+    method: 'post',
+    loading: true,
+    data: params
+  })
+}

+ 5 - 5
manager-admin/src/views/pjDraft/FsGoods.vue

@@ -176,7 +176,7 @@ export default {
       data.forEach(item => {
         item.good_id = item.id
         item.id = null
-        if (this.listData.filter(p => p.code === item.code).length === 0) {
+        if (this.listData.filter(p => p.good_id === item.good_id).length === 0) {
           item.qty = 1
           item.price = item.price_advise
           this.listData.push(item)
@@ -208,7 +208,7 @@ export default {
         API_draftGoods.addModel(item).then(res => {
           this.$message.success('添加成功!')
           this.listData.forEach(p => {
-            if (p.code === item.code) {
+            if (p.good_id === item.good_id) {
               p.id = res.data.id
               this.baseDevice = this.listData.filter(p => p.type_base)
               this.addonDevice = this.listData.filter(p => !p.type_base)
@@ -244,11 +244,11 @@ export default {
   font-size: 14px;
 
   .image {
-    width: 35%;
+    width: 38%;
   }
   .image img {
-    width: 120px;
-    height: 120px;
+    width: 100px;
+    height: 100px;
   }
   .info div {
     margin-bottom: 5px;

+ 3 - 0
manager-admin/src/views/pjDraft/SelfList.vue

@@ -148,6 +148,9 @@ export default {
     },
     handleAdd() {
       this.$router.push({ name: 'draftEdit', params: { id: 0, callback: this.GET_List }})
+    },
+    gotoOrder(orderNO) {
+      this.$router.push({ name: 'pjOrderEdit', params: { id: orderNO, callback: this.GET_List }})
     }
   }
 }

+ 14 - 2
manager-admin/src/views/pjOrder/Edit.vue

@@ -30,7 +30,7 @@
           相关负责人
         </template>
         <el-checkbox-group v-model="checkList">
-          <el-checkbox v-for="(item, index) in userList" :label="item.email" :value="item.email"> {{ item.user_name }}</el-checkbox>
+          <el-checkbox v-for="(item, index) in userList" :key="index" :label="item.email" :value="item.email"> {{ item.user_name }}</el-checkbox>
         </el-checkbox-group>
       </el-descriptions-item>
     </el-descriptions>
@@ -319,7 +319,7 @@ export default {
       serverFormRule: {},
       disable: false,
       checkList: [],
-      userList: [],
+      userList: []
     }
   },
   mounted() {
@@ -521,6 +521,18 @@ export default {
       }).catch(() => {})
     },
     handleSendEmail() {
+      let list = []
+      let x = ['00:00', '00:01', '24:00']
+      let data = []
+      x.forEach(item => {
+        list.forEach(t => {
+          if (item === t.log_time) {
+            data.push(t.value)
+          } else {
+            data.push(0)
+          }
+        })
+      })
       console.log('-------', this.checkList)
       API_pjChargePerson.sendEmail(this.checkList, this.modelForm.order_no).then(res => {
         if (res.success) {

+ 198 - 81
manager-admin/src/views/pjOrder/Items.vue

@@ -1,90 +1,151 @@
 <template>
   <div class="container">
-    <en-table-layout
-      :tableData="tableData.data"
-      :loading="loading"
-      tooltip-effect="dark"
-      @selection-change="handleSelectionChange"
-    >
-      <div slot="toolbar" class="inner-toolbar">
-        <div class="toolbar-btns">
-          <el-button type="primary" @click="outExcel">导出当前页</el-button>
-          <el-button type="warning" @click="outSelect">导出所选</el-button>
-        </div>
-        <div class="toolbar-search">
+    <el-tabs type="border-card" v-model="params.type" @tab-click="sousuo">
+      <el-tab-pane label="所有产品" name="0"></el-tab-pane>
+      <el-tab-pane label="未完成产品" name="1"></el-tab-pane>
+      <el-tab-pane label="未完成统计" name="2"></el-tab-pane>
+      <en-table-layout
+        :tableData="tableData.data"
+        :loading="loading"
+        tooltip-effect="dark"
+        @selection-change="handleSelectionChange"
+      >
+        <div slot="toolbar" class="inner-toolbar">
+          <div v-if="params.type !== '2'" class="toolbar-btns">
+            <el-button type="primary" @click="outExcel">导出当前页</el-button>
+            <el-button type="warning" @click="outSelect">导出所选</el-button>
+          </div>
+          <div class="toolbar-search">
+            <div style="float: left">
+              <el-input v-model="params.order_name" placeholder="输入项目搜索" size="" clearable />
+            </div>
+            <div style="float: left">
+              <el-input v-model="params.keyword" placeholder="输入产品名搜索" size="" clearable />
+            </div>
+            <el-button @click="sousuo">搜索</el-button>
+            <!--              <el-input v-model="params.keyword" placeholder="输入项目搜索" size="mini" clearable />-->
+          </div>
         </div>
-      </div>
 
-      <template slot="table-columns">
-        <el-table-column
-          type="selection"
-          width="55">
-        </el-table-column>
-        <el-table-column label="创建时间" :formatter="MixinUnixToDate" prop="create_time" sortable width="160"></el-table-column>
-        <el-table-column label="项目号" width="180">
-          <template slot-scope="scope">
-            <el-button round @click="gotoOrder(scope.row.order_no)">{{scope.row.order_no}}</el-button>
-          </template>
-        </el-table-column>
-        <el-table-column label="产品名称" width="220">
-          <template slot-scope="scope">
-            <div class="goods-info">
-              <div class="goods-image" style="margin: 0 20px;">
-                <img :src="scope.row.image"/>
-              </div>
-              <div class="goods-name-box">
-                <div class="goods-name">{{ scope.row.name }}</div>
-                <el-tag type="warning" v-if="scope.row.type === '风尚版'">{{scope.row.type}}</el-tag>
-                <el-tag v-else>{{scope.row.type}}</el-tag>
+        <template slot="table-columns">
+          <el-table-column
+            type="selection"
+            width="55">
+          </el-table-column>
+          <!--            <el-table-column label="创建时间" :formatter="MixinUnixToDate" prop="create_time" sortable width="160"></el-table-column>-->
+          <el-table-column v-if="params.type !== '2'" label="项目" width="180">
+            <template slot-scope="scope">
+              <el-button round size="mini" @click="gotoOrder(scope.row.order_no)">{{scope.row.order_name}}</el-button>
+            </template>
+          </el-table-column>
+          <el-table-column label="产品名称" min-width="220">
+            <template slot-scope="scope">
+              <div class="goods-info">
+                <div class="goods-image" style="margin: 0 20px;">
+                  <img :src="scope.row.image"/>
+                </div>
+                <div class="goods-name-box">
+                  <div class="goods-name">{{ scope.row.name }}</div>
+                  <el-tag type="warning" v-if="scope.row.type === '风尚版'">{{scope.row.type}}</el-tag>
+                  <el-tag v-else>{{scope.row.type}}</el-tag>
+                </div>
               </div>
-            </div>
-          </template>
-        </el-table-column>
-        <el-table-column label="生产型号" width="220">
-          <template slot-scope="scope">
-            <el-button round size="mini" @click="gotoGoods(scope.row.good_id)">{{ scope.row.code }}</el-button>
-          </template>
-        </el-table-column>
-        <el-table-column label="生产编码" prop="no"></el-table-column>
-        <el-table-column label="数量" prop="qty"></el-table-column>
-        <el-table-column label="销售备注" prop="sales_remark"></el-table-column>
-        <el-table-column label="要求发货日期" :formatter="MixinUnixToDay" prop="ship_date_required" sortable></el-table-column>
-        <el-table-column label="技术" prop="tech_name"></el-table-column>
-        <el-table-column label="硬件版本" prop="hard_ver"></el-table-column>
-        <el-table-column label="软件版本" prop="soft_ver"></el-table-column>
-        <el-table-column label="技术备注" prop="tech_remark"></el-table-column>
-        <el-table-column label="生产" prop="produce_name"></el-table-column>
-        <el-table-column label="生产状态" prop="produce_status"></el-table-column>
-        <el-table-column label="已产数量" prop="produced_qty"></el-table-column>
-        <el-table-column label="操作" width="150" fixed="right">
-          <template slot-scope="scope">
-            <el-button
-              size="mini"
-              type="primary"
-              @click="handleDetail(scope.row.id)">明细</el-button>
-          </template>
-        </el-table-column>
-      </template>
+            </template>
+          </el-table-column>
+          <el-table-column label="生产编码" prop="no" width="150">
+            <template slot-scope="scope">
+              <el-button round size="mini" @click="gotoGoods(scope.row.good_id)">{{ scope.row.no }}</el-button>
+            </template>
+          </el-table-column>
+          <el-table-column v-if="params.type === '2'" label="总需数量" prop="count1"></el-table-column>
+          <el-table-column v-if="params.type === '2'" label="已产数量" prop="count2"></el-table-column>
+          <el-table-column v-if="params.type === '2'" label="需产数量">
+            <template slot-scope="scope">
+              <span>{{scope.row.count1 - scope.row.count2}}</span>
+            </template>
+          </el-table-column>
+          <el-table-column v-if="params.type !== '2'" label="数量" prop="qty"></el-table-column>
+          <el-table-column v-if="params.type !== '2'" label="已产数量" prop="produced_qty"></el-table-column>
+          <el-table-column v-if="params.type !== '2'" label="需产数量">
+            <template slot-scope="scope">
+              <span>{{scope.row.qty - scope.row.produced_qty}}</span>
+            </template>
+          </el-table-column>
+          <el-table-column v-if="params.type !== '2'" label="要求发货日期" :formatter="MixinUnixToDay" prop="ship_date_required" sortable width="160"></el-table-column>
+          <el-table-column v-if="params.type !== '2'" label="生产状态" prop="produce_status"></el-table-column>
+          <el-table-column label="操作" width="100" fixed="right">
+            <template slot-scope="scope">
+              <el-button v-if="params.type !== '2'" size="mini" type="primary" @click="handleDetail(scope.row.id)">明细</el-button>
+              <el-button v-else size="mini" type="primary" @click="handleDetail2(scope.row)">明细</el-button>
+            </template>
+          </el-table-column>
+        </template>
+
+        <el-pagination
+          v-if="tableData"
+          slot="pagination"
+          @size-change="handlePageSizeChange"
+          @current-change="handlePageCurrentChange"
+          :current-page="tableData.page_no"
+          :page-sizes="[10, 20, 50, 100]"
+          :page-size="tableData.page_size"
+          layout="total, sizes, prev, pager, next, jumper"
+          :total="tableData.data_total">
+        </el-pagination>
+      </en-table-layout>
 
-      <el-pagination
-        v-if="tableData"
-        slot="pagination"
-        @size-change="handlePageSizeChange"
-        @current-change="handlePageCurrentChange"
-        :current-page="tableData.page_no"
-        :page-sizes="[10, 20, 50, 100]"
-        :page-size="tableData.page_size"
-        layout="total, sizes, prev, pager, next, jumper"
-        :total="tableData.data_total">
-      </el-pagination>
-    </en-table-layout>
+    </el-tabs>
+    <el-drawer :title="'《' + myTitle + '》产品明细'" :visible.sync="drawerShow" size="70%">
+      <en-table-layout
+        :tableData="tableData2.data"
+      >
+        <div slot="toolbar" class="inner-toolbar">
+          <div class="toolbar-search">
+            <div style="float: left">
+              <el-input v-model="params2.order_name" placeholder="输入项目名搜索" size="" clearable />
+            </div>
+            <el-button @click="sousuo2">搜索</el-button>
+          </div>
+        </div>
+        <template slot="table-columns">
+          <el-table-column type="index" label="序号" width="55"></el-table-column>
+          <el-table-column label="项目" width="180">
+            <template slot-scope="scope">
+              <el-button round size="mini" @click="gotoOrder(scope.row.order_no)">{{scope.row.order_name}}</el-button>
+            </template>
+          </el-table-column>
+          <el-table-column label="生产编码" prop="no" width="150">
+            <template slot-scope="scope">
+              <el-button round size="mini" @click="gotoGoods(scope.row.good_id)">{{ scope.row.no }}</el-button>
+            </template>
+          </el-table-column>
+          <el-table-column label="数量" prop="qty"></el-table-column>
+          <el-table-column label="已产数量" prop="produced_qty"></el-table-column>
+          <el-table-column label="要求发货日期" :formatter="MixinUnixToDay" prop="ship_date_required" sortable width="160"></el-table-column>
+          <el-table-column label="技术" prop="tech_name"></el-table-column>
+          <el-table-column label="生产" prop="produce_name"></el-table-column>
+          <el-table-column label="生产状态" prop="produce_status"></el-table-column>
+        </template>
+        <el-pagination
+          v-if="tableData2"
+          slot="pagination"
+          @size-change="handlePageSizeChange2"
+          @current-change="handlePageCurrentChange2"
+          :current-page="tableData2.page_no"
+          :page-sizes="[10, 20, 50, 100]"
+          :page-size="tableData2.page_size"
+          layout="total, sizes, prev, pager, next, jumper"
+          :total="tableData2.data_total">
+        </el-pagination>
+      </en-table-layout>
+    </el-drawer>
   </div>
 </template>
 
 <script>
 import * as API_orderItems from '@/api/pjOrderItems.js'
 import { Foundation } from '~/ui-utils'
-import Storage from '../../utils/storage'
+import { getPageGroupList } from '../../api/pjOrderItems'
 
 export default {
   name: 'pjOrderItemsList',
@@ -97,14 +158,23 @@ export default {
       params: {
         page_no: 1,
         page_size: 10,
-        sort: 'create_time',
-        dir: 'desc'
+        type: 0
       },
 
       /** 商品列表数据 */
       tableData: '',
 
-      multipleSelection: []
+      multipleSelection: [],
+      activeName: 0,
+      drawerShow: false,
+      tableData2: [],
+      params2: {
+        page_no: 1,
+        page_size: 10,
+        type: 1,
+        good_id: 1
+      },
+      myTitle: ''
     }
   },
   mounted() {
@@ -119,7 +189,6 @@ export default {
       this.params.page_size = size
       this.GET_List()
     },
-
     /** 分页页数发生改变 */
     handlePageCurrentChange(page) {
       this.params.page_no = page
@@ -127,18 +196,45 @@ export default {
     },
     GET_List() {
       this.loading = true
-      API_orderItems.getList(this.params).then(response => {
+      if (this.params.type > 1) {
+        API_orderItems.getPageGroupList(this.params).then(response => {
+          this.loading = false
+          this.tableData = response
+        }).catch(() => (this.loading = false))
+      } else {
+        API_orderItems.getPageList(this.params).then(response => {
+          this.loading = false
+          this.tableData = response
+        }).catch(() => (this.loading = false))
+      }
+    },
+    /** 分页大小发生改变 */
+    handlePageSizeChange2(size) {
+      this.params2.page_size = size
+      this.GET_List2()
+    },
+    /** 分页页数发生改变 */
+    handlePageCurrentChange2(page) {
+      this.params2.page_no = page
+      this.GET_List2()
+    },
+    GET_List2() {
+      this.loading = true
+      API_orderItems.getPageList(this.params2).then(response => {
         this.loading = false
-        this.tableData = response
+        this.tableData2 = response
       }).catch(() => (this.loading = false))
     },
     handleDetail(id) {
+      this.drawerShow = false
       this.$router.push({ name: 'pjOrderItemDetail', params: { id: id, callback: this.GET_List }})
     },
     gotoOrder(orderNO) {
+      this.drawerShow = false
       this.$router.push({ name: 'pjOrderEdit', params: { id: orderNO, callback: this.GET_List }})
     },
     gotoGoods(goodsCode) {
+      this.drawerShow = false
       this.$router.push({ name: 'goodsDetail', params: { id: goodsCode }})
     },
     handleSelectionChange(val) {
@@ -193,6 +289,27 @@ export default {
         }))
       }
       this.MixinExportJosnToExcel(json, '产品列表')
+    },
+    GET_GroupList() {
+      this.loading = true
+      API_orderItems.getPageGroupList(this.params).then(response => {
+        this.loading = false
+        this.tableData = response
+      }).catch(() => (this.loading = false))
+    },
+    sousuo() {
+      this.params.page_no = 1
+      this.GET_List()
+    },
+    sousuo2() {
+      this.params2.page_no = 1
+      this.GET_List2()
+    },
+    handleDetail2(row) {
+      this.myTitle = row.name
+      this.params2.good_id = row.good_id
+      this.GET_List2()
+      this.drawerShow = true
     }
   }
 }

+ 89 - 8
manager-admin/src/views/pjOrder/OrderItems.vue

@@ -8,7 +8,7 @@
       <el-tab-pane label="图表">
         <el-divider>标准配置</el-divider>
         <el-row :gutter="24" type="flex" style="flex-wrap: wrap; flex-direction: row">
-          <el-col :span="8" v-for="item in baseDevice" :key="item.id">
+          <el-col :span="8" v-for="(item, index) in baseDevice" :key="item.id">
             <el-card shadow="always">
               <div slot="header" class="clearfix">
                 <el-link @click="() => { $router.push({ path: `/pj/pj-goods-detail/${item.good_id}` }) }">{{ item.name }}</el-link>
@@ -52,6 +52,19 @@
                   </el-divider>
                   <div class="tech_panel">
                     <div>填写人:{{item.produce_name}}</div>
+                    <div>填写时间:<span style="font-size: 11px">{{ item.produce_time }}</span></div>
+                    <div @click="clickImg(index)">
+                      <el-upload
+                        :action="`${MixinUploadApi}?scene=pjorders`"
+                        list-type="picture-card"
+                        :on-preview="handlePictureCardPreview"
+                        :before-upload="beforeAvatarUpload"
+                        :on-success="handleImageSuccess"
+                        :limit="1"
+                      >
+                        <i class="el-icon-plus"></i>
+                      </el-upload>
+                    </div>
                     <div>生产状态:
                       <el-select placeholder="请选择" v-model="item.produce_status">
                         <el-option value="采购原料中"></el-option>
@@ -67,6 +80,16 @@
                 <template v-else>
                   <el-divider>生产情况</el-divider>
                   <div>填写人:{{item.produce_name}}</div>
+                  <div>填写时间:<span style="font-size: 11px">{{ item.produce_time }}</span></div>
+                  <el-upload
+                    :action="`${MixinUploadApi}?scene=pjorders`"
+                    list-type="picture-card"
+                    :disabled = "true"
+                    :before-upload="beforeAvatarUpload"
+                    :limit="1"
+                  >
+                    <i class="el-icon-plus"></i>
+                  </el-upload>
                   <div>生产状态:{{item.produce_status}}</div>
                   <div>完成量:<el-input v-model="item.produced_qty" :disabled="true">
                     <template slot="append">共{{item.qty}}</template>
@@ -147,6 +170,12 @@
           <el-table-column prop="hard_ver" label="硬件版本"></el-table-column>
           <el-table-column prop="soft_ver" label="软件版本"></el-table-column>
           <el-table-column prop="qty" label="数量" width="100"></el-table-column>
+          <el-table-column prop="produced_qty" label="已产数量" width="100"></el-table-column>
+          <el-table-column prop="produced_qty" label="需产产数量" width="100">
+            <template slot-scope="scope">
+              <span>{{ scope.row.qty - scope.row.produced_qty}}</span>
+            </template>
+          </el-table-column>
           <el-table-column prop="price" label="价格" width="100"></el-table-column>
           <el-table-column prop="sales_remark" label="销售备注"></el-table-column>
         </el-table>
@@ -155,7 +184,9 @@
         </div>
       </el-tab-pane>
     </el-tabs>
-
+    <el-dialog :visible.sync="dialogImage">
+      <img width="100%" :src="dialogImageUrl" alt="">
+    </el-dialog>
   </div>
 </template>
 
@@ -190,7 +221,10 @@ export default {
       },
       listData: [],
       baseDevice: [],
-      addonDevice: []
+      addonDevice: [],
+      dialogImage: false,
+      dialogImageUrl: '',
+      index: 0
     }
   },
   mounted() {
@@ -219,17 +253,34 @@ export default {
     handleTechSave(item) {
       const adminUser = JSON.parse(Storage.getItem('admin_user'))
       item.tech_user = adminUser.uid
-      item.tech_name = adminUser.realname
-
+      if (item.tech_name) {
+        item.tech_name = item.tech_name + ',' + adminUser.realname
+      } else {
+        item.tech_name = adminUser.realname
+      }
       API_orderItems.editModelAndStatus(item, 1).then(res => {
         this.$message.success('保存成功!')
       })
     },
     handleProduceSave(item) {
+      if (item.produced_qty) {
+        if (item.produced_qty < 0) {
+          this.$message.error('数量不能小于0!')
+          return
+        }
+      }
       const adminUser = JSON.parse(Storage.getItem('admin_user'))
       item.produce_user = adminUser.uid
-      item.produce_name = adminUser.realname
-
+      if (item.produce_name) {
+        item.produce_name = item.produce_name + ',' + adminUser.realname
+      } else {
+        item.produce_name = adminUser.realname
+      }
+      if (item.produce_time) {
+        item.produce_time = item.produce_time + ',' + Foundation.unixToDate(Math.round(new Date() / 1000))
+      } else {
+        item.produce_time = Foundation.unixToDate(Math.round(new Date() / 1000))
+      }
       API_orderItems.editModelAndStatus(item, 2).then(res => {
         this.$message.success('保存成功!')
       })
@@ -249,6 +300,31 @@ export default {
         }))
       }
       this.MixinExportJosnToExcel(json, '产品列表')
+    },
+    handlePictureCardPreview(file) {
+      this.dialogImageUrl = file.url
+      this.dialogImage = true
+    },
+    /** 图片上传之前的校验  */
+    beforeAvatarUpload(file) {
+      const isType = file.type === 'image/jpeg' || file.type === 'image/jpg' || file.type === 'image/png'
+      const isLt1M = file.size / 1024 / 1024 < 3
+      if (!isType) {
+        this.$message.error('上传图片只能是 JPG/JPEG/PNG 格式!')
+      }
+      if (!isLt1M) {
+        this.$message.error('上传图片大小不能超过 3MB!')
+      }
+      return isType && isLt1M
+    },
+    /** 文件列表上传成功时的钩子  上传成功校验 */
+    async handleImageSuccess(response, file) {
+      if (file.status === 'success') {
+        this.$set(this.baseDevice[this.index], 'produce_img', response.url)
+      }
+    },
+    clickImg(index) {
+      this.index = index
     }
   }
 }
@@ -263,7 +339,7 @@ export default {
   font-size: 14px;
 
   .image {
-    width: 35%;
+    width: 38%;
   }
   .image img {
     width: 100px;
@@ -280,4 +356,9 @@ export default {
 .tech_panel div{
   margin: 8px 5px 3px 3px;
 }
+.avatar {
+  width: 100px;
+  height: 100px;
+  display: block;
+}
 </style>

+ 1 - 1
manager-admin/src/views/setting/auth-settings/administratorManage.vue

@@ -23,7 +23,7 @@
         <el-table-column prop="real_name" label="真实姓名"/>
         <el-table-column prop="email" label="邮箱"/>
         <el-table-column prop="user_state" label="状态" :formatter="formatState"/>
-        <el-table-column label="操作">
+        <el-table-column label="操作" width="170">
           <template slot-scope="scope">
             <el-button
               size="mini"