chris 3 years ago
parent
commit
02d1de8ba9

+ 35 - 0
src/api/product.js

@@ -42,3 +42,38 @@ export function getDrawingDetail (id) {
     method: 'get'
   })
 }
+
+// 工种列表
+export function getWorkTypeList (params) {
+  return request({
+    url: request.adornUrl(`/biz-service/workType/list`),
+    method: 'get',
+    params: params
+  })
+}
+
+// 工种详情
+export function getWorkTypeDetail (id) {
+  return request({
+    url: request.adornUrl(`/biz-service/workType/info/${id}`),
+    method: 'get'
+  })
+}
+
+// 新增工种
+export function addWorkType (data) {
+  return request({
+    url: request.adornUrl(`/biz-service/workType/save`),
+    method: 'post',
+    data
+  })
+}
+
+// 更新工种
+export function updateWorkType (data) {
+  return request({
+    url: request.adornUrl(`/biz-service/workType/update`),
+    method: 'post',
+    data
+  })
+}

+ 13 - 0
src/views/modules/production/equipment-add-or-update.vue

@@ -0,0 +1,13 @@
+<template>
+
+</template>
+
+<script>
+  export default {
+    name: 'equipment-add-or-update'
+  }
+</script>
+
+<style scoped>
+
+</style>

+ 296 - 0
src/views/modules/production/equipment.vue

@@ -0,0 +1,296 @@
+<!-- 设备管理 -->
+<template>
+  <div class="production">
+    <el-form :inline="true" :model="dataForm" @keyup.enter.native="search()">
+      <el-form-item label="采购编码">
+        <el-input v-model="dataForm.purchaseCode" placeholder="采购编码" clearable/>
+      </el-form-item>
+      <el-form-item label="说明">
+        <el-input v-model="dataForm.notes" placeholder="说明" clearable/>
+      </el-form-item>
+      <el-form-item label="类别">
+        <el-select
+          v-model="dataForm.purchaseType"
+          remote
+          placeholder="请选择">
+          <el-option
+            v-for="item in optionsType"
+            :key="item.code"
+            :label="item.value"
+            :value="item.code">
+          </el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item label="申请日期">
+        <el-date-picker
+          v-model="dataForm.applyDate"
+          value-format="yyyy-MM-dd"
+          type="date">
+        </el-date-picker>
+      </el-form-item>
+      <el-form-item label="状态">
+        <el-select
+          v-model="dataForm.purchaseState"
+          remote
+          placeholder="请选择">
+          <el-option
+            v-for="item in optionsState"
+            :key="item.code"
+            :label="item.value"
+            :value="item.code">
+          </el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item>
+        <el-button @click="search()">查询</el-button>
+        <el-button type="primary" @click="addOrUpdateHandle(0, false)">新建采购申请</el-button>
+      </el-form-item>
+    </el-form>
+    <el-table
+      :data="dataList"
+      border
+      v-loading="dataListLoading"
+      style="width: 100%;">
+      <el-table-column
+        label="序号"
+        type="index"
+        width="50"
+        align="center">
+      </el-table-column>
+      <el-table-column
+        prop="purchaseCode"
+        header-align="center"
+        align="center"
+        min-width="100"
+        label="采购编码">
+      </el-table-column>
+      <el-table-column
+        prop="materialName"
+        header-align="center"
+        align="center"
+        min-width="120"
+        label="物品名称">
+      </el-table-column>
+      <el-table-column
+        prop="purchaseType"
+        header-align="center"
+        align="center"
+        :formatter="formatType"
+        label="采购类别">
+      </el-table-column>
+      <el-table-column
+        prop="createTime"
+        header-align="center"
+        align="center"
+        min-width="160"
+        label="申请时间">
+      </el-table-column>
+      <el-table-column
+        prop="applierName"
+        header-align="center"
+        align="center"
+        min-width="100"
+        label="申请人">
+      </el-table-column>
+      <el-table-column
+        prop="deptName"
+        header-align="center"
+        align="center"
+        min-width="100"
+        label="申请部门">
+      </el-table-column>
+      <el-table-column
+        prop="notes"
+        header-align="center"
+        align="center"
+        min-width="180"
+        :show-overflow-tooltip="true"
+        label="说明">
+      </el-table-column>
+      <el-table-column
+        prop="purchaseState"
+        header-align="center"
+        align="center"
+        :formatter="formatState"
+        label="当前状态">
+      </el-table-column>
+      <el-table-column
+        fixed="right"
+        header-align="center"
+        align="center"
+        width="150"
+        label="操作">
+        <template slot-scope="scope">
+          <el-button type="text" size="small" @click="addOrUpdateHandle(scope.row.purchaseId, true)">查看</el-button>
+          <el-button type="text" size="small" @click="addOrUpdateHandle(scope.row.purchaseId, false)">编辑</el-button>
+          <el-button style="color: red" type="text" size="small" @click="revokeHandle(scope.row.purchaseId)">撤回</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    <el-pagination
+      @size-change="sizeChangeHandle"
+      @current-change="currentChangeHandle"
+      :current-page="pageIndex"
+      :page-sizes="[10, 20, 50, 100]"
+      :page-size="pageSize"
+      :total="totalPage"
+      layout="total, sizes, prev, pager, next, jumper">
+    </el-pagination>
+    <!-- 弹窗, 新增 / 修改 -->
+    <add-or-update v-if="addOrUpdateVisible" ref="addOrUpdate" @refreshDataList="getDataList"></add-or-update>
+  </div>
+</template>
+
+<script>
+  import AddOrUpdate from './equipment-add-or-update'
+  import { getDictList } from '@/api/dict'
+  import { getPurchaseList, revokePurchase } from '@/api/sale'
+  export default {
+    name: 'equipment',
+    components: {
+      AddOrUpdate
+    },
+    data () {
+      return {
+        addOrUpdateVisible: false,
+        dataForm: {},
+        dataList: [],
+        pageIndex: 1,
+        pageSize: 10,
+        totalPage: 0,
+        dataListLoading: false,
+        dataListSelections: [],
+        optionsType: [],
+        // 审批状态:0 待提交 1 待审批 2 审批中 3 审批完成 4 审批不通过
+        optionsState: [
+          {
+            code: '0',
+            value: '待提交'
+          },
+          {
+            code: '1',
+            value: '待审批'
+          },
+          {
+            code: '2',
+            value: '审批中'
+          },
+          {
+            code: '3',
+            value: '审批完成'
+          },
+          {
+            code: '4',
+            value: '审批不通过'
+          }
+        ]
+      }
+    },
+    created () {
+      this.getTypeList()
+      this.getDataList()
+    },
+    methods: {
+      // 获取采购类别字典
+      getTypeList () {
+        getDictList({type: 'purchase_type'}).then(({data}) => {
+          if (data) {
+            this.optionsType = data
+          }
+        })
+      },
+      // 查询
+      search () {
+        this.pageIndex = 1
+        this.getDataList()
+      },
+      // 获取数据列表
+      getDataList () {
+        this.dataListLoading = true
+        this.addOrUpdateVisible = false
+        let params = {
+          'current': this.pageIndex,
+          'size': this.pageSize,
+          'applyDate': this.dataForm.applyDate ? this.dataForm.applyDate : null,
+          'notes': this.dataForm.notes ? this.dataForm.notes : null,
+          'purchaseState': this.dataForm.purchaseState ? this.dataForm.purchaseState : null,
+          'purchaseType': this.dataForm.purchaseType ? this.dataForm.purchaseType : null,
+          'purchaseCode': this.dataForm.purchaseCode ? this.dataForm.purchaseCode : null
+        }
+        getPurchaseList(params).then(({data}) => {
+          if (data && data.code === '200') {
+            this.dataList = data.data.records
+            this.totalPage = Number(data.data.total)
+          } else {
+            this.dataList = []
+            this.totalPage = 0
+          }
+          this.dataListLoading = false
+        })
+      },
+      revokeHandle (id) {
+        if (!id) return
+        let data = {id: id}
+        this.$confirm(`确定撤回?`, '提示', {
+          confirmButtonText: '确定',
+          cancelButtonText: '取消',
+          type: 'warning'
+        }).then(() => {
+          revokePurchase(data).then(({data}) => {
+            if (data && data.code === '200') {
+              this.$message({
+                message: '操作成功',
+                type: 'success',
+                duration: 1500,
+                onClose: () => {
+                  this.getDataList()
+                }
+              })
+            } else {
+              this.$message.error(data.msg)
+            }
+          })
+        }).catch(() => {})
+      },
+      // 每页数
+      sizeChangeHandle (val) {
+        this.pageSize = val
+        this.pageIndex = 1
+        this.getDataList()
+      },
+      // 当前页
+      currentChangeHandle (val) {
+        this.pageIndex = val
+        this.getDataList()
+      },
+      // 多选
+      selectionChangeHandle (val) {
+        this.dataListSelections = val
+      },
+      // 新增 / 修改
+      addOrUpdateHandle (id, disable) {
+        this.addOrUpdateVisible = true
+        this.$nextTick(() => {
+          this.$refs.addOrUpdate.init(id, disable)
+        })
+      },
+      // 转换属性“类别”
+      formatType (row) {
+        if (this.optionsType && row.purchaseType) {
+          const item1 = this.optionsType.find((item) => item.code === row.purchaseType.toString())
+          return item1 ? item1.value : ''
+        }
+      },
+      // 转换属性“是否组合产品”
+      formatState (row) {
+        if (!row.purchaseState) return ''
+        const item1 = this.optionsState.find((item) => item.code === row.purchaseState.toString())
+        return item1 ? item1.value : ''
+      }
+    }
+  }
+</script>
+
+<style scoped>
+
+</style>

+ 293 - 0
src/views/modules/production/monitoring.vue

@@ -0,0 +1,293 @@
+<!-- 生产监控管理 -->
+<template>
+  <div class="production">
+    <el-form :inline="true" :model="dataForm" @keyup.enter.native="search()">
+      <el-form-item label="采购编码">
+        <el-input v-model="dataForm.purchaseCode" placeholder="采购编码" clearable/>
+      </el-form-item>
+      <el-form-item label="说明">
+        <el-input v-model="dataForm.notes" placeholder="说明" clearable/>
+      </el-form-item>
+      <el-form-item label="类别">
+        <el-select
+          v-model="dataForm.purchaseType"
+          remote
+          placeholder="请选择">
+          <el-option
+            v-for="item in optionsType"
+            :key="item.code"
+            :label="item.value"
+            :value="item.code">
+          </el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item label="申请日期">
+        <el-date-picker
+          v-model="dataForm.applyDate"
+          value-format="yyyy-MM-dd"
+          type="date">
+        </el-date-picker>
+      </el-form-item>
+      <el-form-item label="状态">
+        <el-select
+          v-model="dataForm.purchaseState"
+          remote
+          placeholder="请选择">
+          <el-option
+            v-for="item in optionsState"
+            :key="item.code"
+            :label="item.value"
+            :value="item.code">
+          </el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item>
+        <el-button @click="search()">查询</el-button>
+        <el-button type="primary" @click="addOrUpdateHandle(0, false)">新建采购申请</el-button>
+      </el-form-item>
+    </el-form>
+    <el-table
+      :data="dataList"
+      border
+      v-loading="dataListLoading"
+      style="width: 100%;">
+      <el-table-column
+        label="序号"
+        type="index"
+        width="50"
+        align="center">
+      </el-table-column>
+      <el-table-column
+        prop="purchaseCode"
+        header-align="center"
+        align="center"
+        min-width="100"
+        label="采购编码">
+      </el-table-column>
+      <el-table-column
+        prop="materialName"
+        header-align="center"
+        align="center"
+        min-width="120"
+        label="物品名称">
+      </el-table-column>
+      <el-table-column
+        prop="purchaseType"
+        header-align="center"
+        align="center"
+        :formatter="formatType"
+        label="采购类别">
+      </el-table-column>
+      <el-table-column
+        prop="createTime"
+        header-align="center"
+        align="center"
+        min-width="160"
+        label="申请时间">
+      </el-table-column>
+      <el-table-column
+        prop="applierName"
+        header-align="center"
+        align="center"
+        min-width="100"
+        label="申请人">
+      </el-table-column>
+      <el-table-column
+        prop="deptName"
+        header-align="center"
+        align="center"
+        min-width="100"
+        label="申请部门">
+      </el-table-column>
+      <el-table-column
+        prop="notes"
+        header-align="center"
+        align="center"
+        min-width="180"
+        :show-overflow-tooltip="true"
+        label="说明">
+      </el-table-column>
+      <el-table-column
+        prop="purchaseState"
+        header-align="center"
+        align="center"
+        :formatter="formatState"
+        label="当前状态">
+      </el-table-column>
+      <el-table-column
+        fixed="right"
+        header-align="center"
+        align="center"
+        width="150"
+        label="操作">
+        <template slot-scope="scope">
+          <el-button type="text" size="small" @click="addOrUpdateHandle(scope.row.purchaseId, true)">查看</el-button>
+          <el-button type="text" size="small" @click="addOrUpdateHandle(scope.row.purchaseId, false)">编辑</el-button>
+          <el-button style="color: red" type="text" size="small" @click="revokeHandle(scope.row.purchaseId)">撤回</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    <el-pagination
+      @size-change="sizeChangeHandle"
+      @current-change="currentChangeHandle"
+      :current-page="pageIndex"
+      :page-sizes="[10, 20, 50, 100]"
+      :page-size="pageSize"
+      :total="totalPage"
+      layout="total, sizes, prev, pager, next, jumper">
+    </el-pagination>
+    <!-- 弹窗, 新增 / 修改 -->
+<!--    <add-or-update v-if="addOrUpdateVisible" ref="addOrUpdate" @refreshDataList="getDataList"></add-or-update>-->
+  </div>
+</template>
+
+<script>
+  // import AddOrUpdate from './purchase-add-or-update'
+  import { getDictList } from '@/api/dict'
+  import { getPurchaseList, revokePurchase } from '@/api/sale'
+  export default {
+    name: 'monitoring',
+    data () {
+      return {
+        addOrUpdateVisible: false,
+        dataForm: {},
+        dataList: [],
+        pageIndex: 1,
+        pageSize: 10,
+        totalPage: 0,
+        dataListLoading: false,
+        dataListSelections: [],
+        optionsType: [],
+        // 审批状态:0 待提交 1 待审批 2 审批中 3 审批完成 4 审批不通过
+        optionsState: [
+          {
+            code: '0',
+            value: '待提交'
+          },
+          {
+            code: '1',
+            value: '待审批'
+          },
+          {
+            code: '2',
+            value: '审批中'
+          },
+          {
+            code: '3',
+            value: '审批完成'
+          },
+          {
+            code: '4',
+            value: '审批不通过'
+          }
+        ]
+      }
+    },
+    created () {
+      this.getTypeList()
+      this.getDataList()
+    },
+    methods: {
+      // 获取采购类别字典
+      getTypeList () {
+        getDictList({type: 'purchase_type'}).then(({data}) => {
+          if (data) {
+            this.optionsType = data
+          }
+        })
+      },
+      // 查询
+      search () {
+        this.pageIndex = 1
+        this.getDataList()
+      },
+      // 获取数据列表
+      getDataList () {
+        this.dataListLoading = true
+        this.addOrUpdateVisible = false
+        let params = {
+          'current': this.pageIndex,
+          'size': this.pageSize,
+          'applyDate': this.dataForm.applyDate ? this.dataForm.applyDate : null,
+          'notes': this.dataForm.notes ? this.dataForm.notes : null,
+          'purchaseState': this.dataForm.purchaseState ? this.dataForm.purchaseState : null,
+          'purchaseType': this.dataForm.purchaseType ? this.dataForm.purchaseType : null,
+          'purchaseCode': this.dataForm.purchaseCode ? this.dataForm.purchaseCode : null
+        }
+        getPurchaseList(params).then(({data}) => {
+          if (data && data.code === '200') {
+            this.dataList = data.data.records
+            this.totalPage = Number(data.data.total)
+          } else {
+            this.dataList = []
+            this.totalPage = 0
+          }
+          this.dataListLoading = false
+        })
+      },
+      revokeHandle (id) {
+        if (!id) return
+        let data = {id: id}
+        this.$confirm(`确定撤回?`, '提示', {
+          confirmButtonText: '确定',
+          cancelButtonText: '取消',
+          type: 'warning'
+        }).then(() => {
+          revokePurchase(data).then(({data}) => {
+            if (data && data.code === '200') {
+              this.$message({
+                message: '操作成功',
+                type: 'success',
+                duration: 1500,
+                onClose: () => {
+                  this.getDataList()
+                }
+              })
+            } else {
+              this.$message.error(data.msg)
+            }
+          })
+        }).catch(() => {})
+      },
+      // 每页数
+      sizeChangeHandle (val) {
+        this.pageSize = val
+        this.pageIndex = 1
+        this.getDataList()
+      },
+      // 当前页
+      currentChangeHandle (val) {
+        this.pageIndex = val
+        this.getDataList()
+      },
+      // 多选
+      selectionChangeHandle (val) {
+        this.dataListSelections = val
+      },
+      // 新增 / 修改
+      addOrUpdateHandle (id, disable) {
+        this.addOrUpdateVisible = true
+        this.$nextTick(() => {
+          this.$refs.addOrUpdate.init(id, disable)
+        })
+      },
+      // 转换属性“类别”
+      formatType (row) {
+        if (this.optionsType && row.purchaseType) {
+          const item1 = this.optionsType.find((item) => item.code === row.purchaseType.toString())
+          return item1 ? item1.value : ''
+        }
+      },
+      // 转换属性“是否组合产品”
+      formatState (row) {
+        if (!row.purchaseState) return ''
+        const item1 = this.optionsState.find((item) => item.code === row.purchaseState.toString())
+        return item1 ? item1.value : ''
+      }
+    }
+  }
+</script>
+
+<style scoped>
+
+</style>

+ 293 - 0
src/views/modules/production/recording.vue

@@ -0,0 +1,293 @@
+<!-- 生产记录 -->
+<template>
+  <div class="production">
+    <el-form :inline="true" :model="dataForm" @keyup.enter.native="search()">
+      <el-form-item label="采购编码">
+        <el-input v-model="dataForm.purchaseCode" placeholder="采购编码" clearable/>
+      </el-form-item>
+      <el-form-item label="说明">
+        <el-input v-model="dataForm.notes" placeholder="说明" clearable/>
+      </el-form-item>
+      <el-form-item label="类别">
+        <el-select
+          v-model="dataForm.purchaseType"
+          remote
+          placeholder="请选择">
+          <el-option
+            v-for="item in optionsType"
+            :key="item.code"
+            :label="item.value"
+            :value="item.code">
+          </el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item label="申请日期">
+        <el-date-picker
+          v-model="dataForm.applyDate"
+          value-format="yyyy-MM-dd"
+          type="date">
+        </el-date-picker>
+      </el-form-item>
+      <el-form-item label="状态">
+        <el-select
+          v-model="dataForm.purchaseState"
+          remote
+          placeholder="请选择">
+          <el-option
+            v-for="item in optionsState"
+            :key="item.code"
+            :label="item.value"
+            :value="item.code">
+          </el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item>
+        <el-button @click="search()">查询</el-button>
+        <el-button type="primary" @click="addOrUpdateHandle(0, false)">新建采购申请</el-button>
+      </el-form-item>
+    </el-form>
+    <el-table
+      :data="dataList"
+      border
+      v-loading="dataListLoading"
+      style="width: 100%;">
+      <el-table-column
+        label="序号"
+        type="index"
+        width="50"
+        align="center">
+      </el-table-column>
+      <el-table-column
+        prop="purchaseCode"
+        header-align="center"
+        align="center"
+        min-width="100"
+        label="采购编码">
+      </el-table-column>
+      <el-table-column
+        prop="materialName"
+        header-align="center"
+        align="center"
+        min-width="120"
+        label="物品名称">
+      </el-table-column>
+      <el-table-column
+        prop="purchaseType"
+        header-align="center"
+        align="center"
+        :formatter="formatType"
+        label="采购类别">
+      </el-table-column>
+      <el-table-column
+        prop="createTime"
+        header-align="center"
+        align="center"
+        min-width="160"
+        label="申请时间">
+      </el-table-column>
+      <el-table-column
+        prop="applierName"
+        header-align="center"
+        align="center"
+        min-width="100"
+        label="申请人">
+      </el-table-column>
+      <el-table-column
+        prop="deptName"
+        header-align="center"
+        align="center"
+        min-width="100"
+        label="申请部门">
+      </el-table-column>
+      <el-table-column
+        prop="notes"
+        header-align="center"
+        align="center"
+        min-width="180"
+        :show-overflow-tooltip="true"
+        label="说明">
+      </el-table-column>
+      <el-table-column
+        prop="purchaseState"
+        header-align="center"
+        align="center"
+        :formatter="formatState"
+        label="当前状态">
+      </el-table-column>
+      <el-table-column
+        fixed="right"
+        header-align="center"
+        align="center"
+        width="150"
+        label="操作">
+        <template slot-scope="scope">
+          <el-button type="text" size="small" @click="addOrUpdateHandle(scope.row.purchaseId, true)">查看</el-button>
+          <el-button type="text" size="small" @click="addOrUpdateHandle(scope.row.purchaseId, false)">编辑</el-button>
+          <el-button style="color: red" type="text" size="small" @click="revokeHandle(scope.row.purchaseId)">撤回</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    <el-pagination
+      @size-change="sizeChangeHandle"
+      @current-change="currentChangeHandle"
+      :current-page="pageIndex"
+      :page-sizes="[10, 20, 50, 100]"
+      :page-size="pageSize"
+      :total="totalPage"
+      layout="total, sizes, prev, pager, next, jumper">
+    </el-pagination>
+    <!-- 弹窗, 新增 / 修改 -->
+<!--    <add-or-update v-if="addOrUpdateVisible" ref="addOrUpdate" @refreshDataList="getDataList"></add-or-update>-->
+  </div>
+</template>
+
+<script>
+  // import AddOrUpdate from './purchase-add-or-update'
+  import { getDictList } from '@/api/dict'
+  import { getPurchaseList, revokePurchase } from '@/api/sale'
+  export default {
+    name: 'recording',
+    data () {
+      return {
+        addOrUpdateVisible: false,
+        dataForm: {},
+        dataList: [],
+        pageIndex: 1,
+        pageSize: 10,
+        totalPage: 0,
+        dataListLoading: false,
+        dataListSelections: [],
+        optionsType: [],
+        // 审批状态:0 待提交 1 待审批 2 审批中 3 审批完成 4 审批不通过
+        optionsState: [
+          {
+            code: '0',
+            value: '待提交'
+          },
+          {
+            code: '1',
+            value: '待审批'
+          },
+          {
+            code: '2',
+            value: '审批中'
+          },
+          {
+            code: '3',
+            value: '审批完成'
+          },
+          {
+            code: '4',
+            value: '审批不通过'
+          }
+        ]
+      }
+    },
+    created () {
+      this.getTypeList()
+      this.getDataList()
+    },
+    methods: {
+      // 获取采购类别字典
+      getTypeList () {
+        getDictList({type: 'purchase_type'}).then(({data}) => {
+          if (data) {
+            this.optionsType = data
+          }
+        })
+      },
+      // 查询
+      search () {
+        this.pageIndex = 1
+        this.getDataList()
+      },
+      // 获取数据列表
+      getDataList () {
+        this.dataListLoading = true
+        this.addOrUpdateVisible = false
+        let params = {
+          'current': this.pageIndex,
+          'size': this.pageSize,
+          'applyDate': this.dataForm.applyDate ? this.dataForm.applyDate : null,
+          'notes': this.dataForm.notes ? this.dataForm.notes : null,
+          'purchaseState': this.dataForm.purchaseState ? this.dataForm.purchaseState : null,
+          'purchaseType': this.dataForm.purchaseType ? this.dataForm.purchaseType : null,
+          'purchaseCode': this.dataForm.purchaseCode ? this.dataForm.purchaseCode : null
+        }
+        getPurchaseList(params).then(({data}) => {
+          if (data && data.code === '200') {
+            this.dataList = data.data.records
+            this.totalPage = Number(data.data.total)
+          } else {
+            this.dataList = []
+            this.totalPage = 0
+          }
+          this.dataListLoading = false
+        })
+      },
+      revokeHandle (id) {
+        if (!id) return
+        let data = {id: id}
+        this.$confirm(`确定撤回?`, '提示', {
+          confirmButtonText: '确定',
+          cancelButtonText: '取消',
+          type: 'warning'
+        }).then(() => {
+          revokePurchase(data).then(({data}) => {
+            if (data && data.code === '200') {
+              this.$message({
+                message: '操作成功',
+                type: 'success',
+                duration: 1500,
+                onClose: () => {
+                  this.getDataList()
+                }
+              })
+            } else {
+              this.$message.error(data.msg)
+            }
+          })
+        }).catch(() => {})
+      },
+      // 每页数
+      sizeChangeHandle (val) {
+        this.pageSize = val
+        this.pageIndex = 1
+        this.getDataList()
+      },
+      // 当前页
+      currentChangeHandle (val) {
+        this.pageIndex = val
+        this.getDataList()
+      },
+      // 多选
+      selectionChangeHandle (val) {
+        this.dataListSelections = val
+      },
+      // 新增 / 修改
+      addOrUpdateHandle (id, disable) {
+        this.addOrUpdateVisible = true
+        this.$nextTick(() => {
+          this.$refs.addOrUpdate.init(id, disable)
+        })
+      },
+      // 转换属性“类别”
+      formatType (row) {
+        if (this.optionsType && row.purchaseType) {
+          const item1 = this.optionsType.find((item) => item.code === row.purchaseType.toString())
+          return item1 ? item1.value : ''
+        }
+      },
+      // 转换属性“是否组合产品”
+      formatState (row) {
+        if (!row.purchaseState) return ''
+        const item1 = this.optionsState.find((item) => item.code === row.purchaseState.toString())
+        return item1 ? item1.value : ''
+      }
+    }
+  }
+</script>
+
+<style scoped>
+
+</style>

+ 293 - 0
src/views/modules/production/scheduling.vue

@@ -0,0 +1,293 @@
+<!-- 排产管理 -->
+<template>
+  <div class="production">
+    <el-form :inline="true" :model="dataForm" @keyup.enter.native="search()">
+      <el-form-item label="采购编码">
+        <el-input v-model="dataForm.purchaseCode" placeholder="采购编码" clearable/>
+      </el-form-item>
+      <el-form-item label="说明">
+        <el-input v-model="dataForm.notes" placeholder="说明" clearable/>
+      </el-form-item>
+      <el-form-item label="类别">
+        <el-select
+          v-model="dataForm.purchaseType"
+          remote
+          placeholder="请选择">
+          <el-option
+            v-for="item in optionsType"
+            :key="item.code"
+            :label="item.value"
+            :value="item.code">
+          </el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item label="申请日期">
+        <el-date-picker
+          v-model="dataForm.applyDate"
+          value-format="yyyy-MM-dd"
+          type="date">
+        </el-date-picker>
+      </el-form-item>
+      <el-form-item label="状态">
+        <el-select
+          v-model="dataForm.purchaseState"
+          remote
+          placeholder="请选择">
+          <el-option
+            v-for="item in optionsState"
+            :key="item.code"
+            :label="item.value"
+            :value="item.code">
+          </el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item>
+        <el-button @click="search()">查询</el-button>
+        <el-button type="primary" @click="addOrUpdateHandle(0, false)">新建采购申请</el-button>
+      </el-form-item>
+    </el-form>
+    <el-table
+      :data="dataList"
+      border
+      v-loading="dataListLoading"
+      style="width: 100%;">
+      <el-table-column
+        label="序号"
+        type="index"
+        width="50"
+        align="center">
+      </el-table-column>
+      <el-table-column
+        prop="purchaseCode"
+        header-align="center"
+        align="center"
+        min-width="100"
+        label="采购编码">
+      </el-table-column>
+      <el-table-column
+        prop="materialName"
+        header-align="center"
+        align="center"
+        min-width="120"
+        label="物品名称">
+      </el-table-column>
+      <el-table-column
+        prop="purchaseType"
+        header-align="center"
+        align="center"
+        :formatter="formatType"
+        label="采购类别">
+      </el-table-column>
+      <el-table-column
+        prop="createTime"
+        header-align="center"
+        align="center"
+        min-width="160"
+        label="申请时间">
+      </el-table-column>
+      <el-table-column
+        prop="applierName"
+        header-align="center"
+        align="center"
+        min-width="100"
+        label="申请人">
+      </el-table-column>
+      <el-table-column
+        prop="deptName"
+        header-align="center"
+        align="center"
+        min-width="100"
+        label="申请部门">
+      </el-table-column>
+      <el-table-column
+        prop="notes"
+        header-align="center"
+        align="center"
+        min-width="180"
+        :show-overflow-tooltip="true"
+        label="说明">
+      </el-table-column>
+      <el-table-column
+        prop="purchaseState"
+        header-align="center"
+        align="center"
+        :formatter="formatState"
+        label="当前状态">
+      </el-table-column>
+      <el-table-column
+        fixed="right"
+        header-align="center"
+        align="center"
+        width="150"
+        label="操作">
+        <template slot-scope="scope">
+          <el-button type="text" size="small" @click="addOrUpdateHandle(scope.row.purchaseId, true)">查看</el-button>
+          <el-button type="text" size="small" @click="addOrUpdateHandle(scope.row.purchaseId, false)">编辑</el-button>
+          <el-button style="color: red" type="text" size="small" @click="revokeHandle(scope.row.purchaseId)">撤回</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    <el-pagination
+      @size-change="sizeChangeHandle"
+      @current-change="currentChangeHandle"
+      :current-page="pageIndex"
+      :page-sizes="[10, 20, 50, 100]"
+      :page-size="pageSize"
+      :total="totalPage"
+      layout="total, sizes, prev, pager, next, jumper">
+    </el-pagination>
+    <!-- 弹窗, 新增 / 修改 -->
+<!--    <add-or-update v-if="addOrUpdateVisible" ref="addOrUpdate" @refreshDataList="getDataList"></add-or-update>-->
+  </div>
+</template>
+
+<script>
+  // import AddOrUpdate from './purchase-add-or-update'
+  import { getDictList } from '@/api/dict'
+  import { getPurchaseList, revokePurchase } from '@/api/sale'
+  export default {
+    name: 'scheduling',
+    data () {
+      return {
+        addOrUpdateVisible: false,
+        dataForm: {},
+        dataList: [],
+        pageIndex: 1,
+        pageSize: 10,
+        totalPage: 0,
+        dataListLoading: false,
+        dataListSelections: [],
+        optionsType: [],
+        // 审批状态:0 待提交 1 待审批 2 审批中 3 审批完成 4 审批不通过
+        optionsState: [
+          {
+            code: '0',
+            value: '待提交'
+          },
+          {
+            code: '1',
+            value: '待审批'
+          },
+          {
+            code: '2',
+            value: '审批中'
+          },
+          {
+            code: '3',
+            value: '审批完成'
+          },
+          {
+            code: '4',
+            value: '审批不通过'
+          }
+        ]
+      }
+    },
+    created () {
+      this.getTypeList()
+      this.getDataList()
+    },
+    methods: {
+      // 获取采购类别字典
+      getTypeList () {
+        getDictList({type: 'purchase_type'}).then(({data}) => {
+          if (data) {
+            this.optionsType = data
+          }
+        })
+      },
+      // 查询
+      search () {
+        this.pageIndex = 1
+        this.getDataList()
+      },
+      // 获取数据列表
+      getDataList () {
+        this.dataListLoading = true
+        this.addOrUpdateVisible = false
+        let params = {
+          'current': this.pageIndex,
+          'size': this.pageSize,
+          'applyDate': this.dataForm.applyDate ? this.dataForm.applyDate : null,
+          'notes': this.dataForm.notes ? this.dataForm.notes : null,
+          'purchaseState': this.dataForm.purchaseState ? this.dataForm.purchaseState : null,
+          'purchaseType': this.dataForm.purchaseType ? this.dataForm.purchaseType : null,
+          'purchaseCode': this.dataForm.purchaseCode ? this.dataForm.purchaseCode : null
+        }
+        getPurchaseList(params).then(({data}) => {
+          if (data && data.code === '200') {
+            this.dataList = data.data.records
+            this.totalPage = Number(data.data.total)
+          } else {
+            this.dataList = []
+            this.totalPage = 0
+          }
+          this.dataListLoading = false
+        })
+      },
+      revokeHandle (id) {
+        if (!id) return
+        let data = {id: id}
+        this.$confirm(`确定撤回?`, '提示', {
+          confirmButtonText: '确定',
+          cancelButtonText: '取消',
+          type: 'warning'
+        }).then(() => {
+          revokePurchase(data).then(({data}) => {
+            if (data && data.code === '200') {
+              this.$message({
+                message: '操作成功',
+                type: 'success',
+                duration: 1500,
+                onClose: () => {
+                  this.getDataList()
+                }
+              })
+            } else {
+              this.$message.error(data.msg)
+            }
+          })
+        }).catch(() => {})
+      },
+      // 每页数
+      sizeChangeHandle (val) {
+        this.pageSize = val
+        this.pageIndex = 1
+        this.getDataList()
+      },
+      // 当前页
+      currentChangeHandle (val) {
+        this.pageIndex = val
+        this.getDataList()
+      },
+      // 多选
+      selectionChangeHandle (val) {
+        this.dataListSelections = val
+      },
+      // 新增 / 修改
+      addOrUpdateHandle (id, disable) {
+        this.addOrUpdateVisible = true
+        this.$nextTick(() => {
+          this.$refs.addOrUpdate.init(id, disable)
+        })
+      },
+      // 转换属性“类别”
+      formatType (row) {
+        if (this.optionsType && row.purchaseType) {
+          const item1 = this.optionsType.find((item) => item.code === row.purchaseType.toString())
+          return item1 ? item1.value : ''
+        }
+      },
+      // 转换属性“是否组合产品”
+      formatState (row) {
+        if (!row.purchaseState) return ''
+        const item1 = this.optionsState.find((item) => item.code === row.purchaseState.toString())
+        return item1 ? item1.value : ''
+      }
+    }
+  }
+</script>
+
+<style scoped>
+
+</style>

+ 159 - 0
src/views/modules/tech/work-type-add-or-update.vue

@@ -0,0 +1,159 @@
+<template>
+  <div>
+    <el-dialog
+      :title="!id ? '新增': display ? '详情' : '修改'"
+      width="70%"
+      :close-on-click-modal="false"
+      :visible.sync="visible">
+      <el-form :model="dataForm" :rules="dataRule" ref="dataForm" label-width="auto">
+        <el-row class="my-row">
+          <el-col :span="8">
+            <el-form-item label="工种编码" prop="code">
+              <el-input v-model="dataForm.code" :disabled="true" placeholder="系统自动生成"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="8" style="padding-left: 20px">
+            <el-form-item label="工种名称" prop="name">
+              <el-input v-model="dataForm.name" :disabled="display" placeholder="工种名称"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="8" style="padding-left: 20px">
+            <el-form-item label="工种级别" prop="level">
+              <el-select
+                v-model="dataForm.level"
+                :disabled="display"
+                placeholder="请选择">
+                <el-option
+                  v-for="item in optionsLevel"
+                  :key="item.code"
+                  :label="item.value"
+                  :value="item.code">
+                </el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row class="my-row">
+          <el-col :span="24">
+            <el-form-item label="工种要求" prop="requirement">
+              <el-input v-model="dataForm.requirement" :disabled="display" placeholder="工种要求"></el-input>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row class="my-row">
+          <el-col :span="24">
+            <el-form-item label="备注说明" prop="notes">
+              <el-input v-model="dataForm.notes" :disabled="display" placeholder="备注说明"></el-input>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row class="my-row">
+          <el-col :span="24">
+            <el-form-item label="掌握人" prop="masterIds">
+              <user-components v-model="dataForm.masterIds" :user-ids="dataForm.masterIds" @change='masterChange' :disabled="display" style="width:100%;"/>
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+      <span slot="footer" class="dialog-footer">
+          <el-button @click="visible = false">取消</el-button>
+          <el-button v-if="!display" type="primary" @click="dataFormSubmit()">确定</el-button>
+        </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+  import UserComponents from '../common/user-components'
+  import { getDictList } from '@/api/dict'
+  import { addWorkType, updateWorkType, getWorkTypeDetail } from '@/api/product'
+  export default {
+    name: 'work-type-add-or-update',
+    components: {UserComponents},
+    computed: {
+      orgId: {
+        get () { return this.$store.state.user.orgId }
+      }
+    },
+    data () {
+      return {
+        visible: false,
+        display: false,
+        optionsLevel: [],
+        id: 0,
+        dataForm: {},
+        dataRule: {
+          name: [{ required: true, message: '工种名称不能为空', trigger: 'blur' }],
+          level: [{ required: true, message: '工种级别不能为空', trigger: 'change' }],
+          requirement: [{ required: true, message: '工种要求不能为空', trigger: 'blur' }]
+        }
+      }
+    },
+    methods: {
+      async init (id, display) {
+        this.dataForm = {}
+        this.optionsLevel = []
+        this.visible = true
+        this.id = id || 0
+        this.display = display
+        // 获取工种级别
+        await getDictList({type: 'pro_work_level'}).then(({data}) => {
+          if (data) {
+            this.optionsLevel = data
+          }
+        })
+        if (!id) return
+        await getWorkTypeDetail(this.id).then(({data}) => {
+          if (data && data.code === '200') {
+            this.dataForm = data.data
+          }
+        })
+      },
+      validateField (type) {
+        this.$refs.dataForm.validateField(type)
+      },
+      // 表单提交
+      dataFormSubmit () {
+        this.$refs['dataForm'].validate((valid) => {
+          // 检查掌握人
+          if (!this.id && (!this.dataForm.masterIds || this.dataForm.masterIds.length === 0)) {
+            this.$message.warning('掌握人不能为空')
+          }
+          if (valid) {
+            let params = {
+              level: this.dataForm.level,
+              masterIds: this.dataForm.masterIds,
+              name: this.dataForm.name,
+              notes: this.dataForm.notes,
+              orgId: this.orgId,
+              requirement: this.dataForm.requirement,
+              typeId: this.id ? this.id : null
+            }
+            this.id ? updateWorkType(params) : addWorkType(params).then(({data}) => {
+              if (data && data.code === '200') {
+                this.$message({
+                  message: '操作成功',
+                  type: 'success',
+                  duration: 1500,
+                  onClose: () => {
+                    this.visible = false
+                    this.$emit('refreshDataList')
+                  }
+                })
+              } else {
+                this.$message.error(data.msg)
+              }
+            }).catch(() => {})
+          }
+        })
+      },
+      masterChange (val) {
+        this.dataForm.masterIds = val
+      }
+    }
+  }
+</script>
+
+<style scoped>
+
+</style>

+ 198 - 2
src/views/modules/tech/work-type.vue

@@ -1,10 +1,206 @@
+<!-- 工种管理 -->
 <template>
-
+  <div class="work-type">
+    <el-form :inline="true" :model="dataForm" @keyup.enter.native="queryData()">
+      <el-form-item label="名称">
+        <el-input v-model="dataForm.name" placeholder="名称" clearable/>
+      </el-form-item>
+      <el-form-item label="级别">
+        <el-select
+          v-model="dataForm.level"
+          remote
+          placeholder="请选择">
+          <el-option
+            v-for="item in optionsLevel"
+            :key="item.code"
+            :label="item.value"
+            :value="item.code">
+          </el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item>
+        <el-button @click="queryData()">查询</el-button>
+        <el-button type="primary" @click="addOrUpdateHandle(0, false)">创建新工种</el-button>
+      </el-form-item>
+    </el-form>
+    <el-table
+      :data="dataList"
+      border
+      v-loading="dataListLoading"
+      style="width: 100%;">
+      <el-table-column
+        label="序号"
+        type="index"
+        width="50"
+        align="center">
+      </el-table-column>
+      <el-table-column
+        prop="code"
+        header-align="center"
+        align="center"
+        min-width="100"
+        label="工种编码">
+      </el-table-column>
+      <el-table-column
+        prop="name"
+        header-align="center"
+        align="center"
+        min-width="120"
+        label="工种名称">
+      </el-table-column>
+      <el-table-column
+        prop="level"
+        header-align="center"
+        align="center"
+        :formatter="formatLevel"
+        label="工种级别">
+      </el-table-column>
+      <el-table-column
+        prop="requirement"
+        header-align="center"
+        align="center"
+        min-width="120"
+        label="工种要求">
+      </el-table-column>
+      <el-table-column
+        prop="masterNames"
+        header-align="center"
+        align="center"
+        :formatter="formatNames"
+        min-width="120"
+        label="掌握人">
+      </el-table-column>
+      <el-table-column
+        prop="notes"
+        header-align="center"
+        align="center"
+        min-width="180"
+        :show-overflow-tooltip="true"
+        label="备注">
+      </el-table-column>
+      <el-table-column
+        fixed="right"
+        header-align="center"
+        align="center"
+        width="150"
+        label="操作">
+        <template slot-scope="scope">
+          <el-button type="text" size="small" @click="addOrUpdateHandle(scope.row.typeId, true)">查看</el-button>
+          <el-button type="text" size="small" @click="addOrUpdateHandle(scope.row.typeId, false)">编辑</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    <el-pagination
+      @size-change="sizeChangeHandle"
+      @current-change="currentChangeHandle"
+      :current-page="pageIndex"
+      :page-sizes="[10, 20, 50, 100]"
+      :page-size="pageSize"
+      :total="totalPage"
+      layout="total, sizes, prev, pager, next, jumper">
+    </el-pagination>
+    <!-- 弹窗, 新增 / 修改 -->
+    <add-or-update v-if="addOrUpdateVisible" ref="addOrUpdate" @refreshDataList="getDataList"></add-or-update>
+  </div>
 </template>
 
 <script>
+  import AddOrUpdate from './work-type-add-or-update'
+  import { getDictList } from '@/api/dict'
+  import { getWorkTypeList } from '@/api/product'
   export default {
-    name: 'work-type'
+    name: 'work-type',
+    components: {
+      AddOrUpdate
+    },
+    data () {
+      return {
+        addOrUpdateVisible: false,
+        dataForm: {},
+        dataList: [],
+        pageIndex: 1,
+        pageSize: 10,
+        totalPage: 0,
+        dataListLoading: false,
+        dataListSelections: [],
+        optionsLevel: []
+      }
+    },
+    created () {
+      this.getLevelList()
+      this.getDataList()
+    },
+    methods: {
+      // 获取工种级别
+      getLevelList () {
+        getDictList({type: 'pro_work_level'}).then(({data}) => {
+          if (data) {
+            this.optionsLevel = data
+          }
+        })
+      },
+      // 查询
+      queryData () {
+        this.pageIndex = 1
+        this.getDataList()
+      },
+      // 获取数据列表
+      getDataList () {
+        this.dataListLoading = true
+        this.addOrUpdateVisible = false
+        let params = {
+          'current': this.pageIndex,
+          'size': this.pageSize,
+          'name': this.dataForm.name ? this.dataForm.name : null,
+          'level': this.dataForm.level ? this.dataForm.level : null
+        }
+        getWorkTypeList(params).then(({data}) => {
+          if (data && data.code === '200') {
+            this.dataList = data.data.records
+            this.totalPage = Number(data.data.total)
+          } else {
+            this.dataList = []
+            this.totalPage = 0
+          }
+          this.dataListLoading = false
+        })
+      },
+      // 每页数
+      sizeChangeHandle (val) {
+        this.pageSize = val
+        this.pageIndex = 1
+        this.getDataList()
+      },
+      // 当前页
+      currentChangeHandle (val) {
+        this.pageIndex = val
+        this.getDataList()
+      },
+      // 多选
+      selectionChangeHandle (val) {
+        this.dataListSelections = val
+      },
+      // 新增 / 修改
+      addOrUpdateHandle (id, disable) {
+        this.addOrUpdateVisible = true
+        this.$nextTick(() => {
+          this.$refs.addOrUpdate.init(id, disable)
+        })
+      },
+      // 转换属性“类别”
+      formatLevel (row) {
+        if (this.optionsLevel && row.level) {
+          const item1 = this.optionsLevel.find((item) => item.code === row.level.toString())
+          return item1 ? item1.value : ''
+        }
+      },
+      // 转换属性“掌握人”
+      formatNames (row) {
+        if (row.masterNames && row.masterNames.length > 0) {
+          return row.masterNames.toString()
+        } else { return '' }
+      }
+    }
   }
 </script>