chris 3 rokov pred
rodič
commit
3128f9c8e3

+ 1 - 2
src/api/dict.js

@@ -2,12 +2,11 @@ import request from '@/utils/httpRequest'
 
 /**
  * 根据字典类型获取字典List
- * @param dictType
  */
 export function getDictList (params) {
   return request({
     url: request.adornUrl('/user-service/dict/queryByType'),
     method: 'get',
-    params
+    params: params
   })
 }

+ 18 - 0
src/api/sale.js

@@ -0,0 +1,18 @@
+import request from '@/utils/httpRequest'
+
+// 采购列表
+export function getPurchaseList (params) {
+  return request({
+    url: request.adornUrl(`/biz-service/purchase/list`),
+    method: 'get',
+    params: params
+  })
+}
+
+// 采购详情
+export function getPurchaseDetail (id) {
+  return request({
+    url: request.adornUrl(`/biz-service/purchase/info/${id}`),
+    method: 'get'
+  })
+}

+ 10 - 0
src/api/user.js

@@ -0,0 +1,10 @@
+import request from '@/utils/httpRequest'
+
+// 查询用户
+export function getUserList (params) {
+  return request({
+    url: request.adornUrl('/user-service/user/list'),
+    method: 'get',
+    params: params
+  })
+}

+ 13 - 0
src/views/modules/sale/add-material.vue

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

+ 316 - 0
src/views/modules/sale/purchase-add-or-update.vue

@@ -0,0 +1,316 @@
+<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="purchaseCode">
+              <el-input v-model="dataForm.purchaseCode" :disabled="display || !id" placeholder="系统自动生成,无需填写"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="16" style="padding-left: 20px">
+            <el-form-item label="付款方式" prop="payType">
+              <el-radio-group v-model="dataForm.payType" :disabled="display">
+                <el-radio :label='"0"'>对公转账</el-radio>
+                <el-radio :label='"1"'>先行垫付</el-radio>
+                <el-radio :label='"2"'>财务预支</el-radio>
+              </el-radio-group>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row class="my-row">
+          <el-col :span="8">
+            <el-form-item label="采购类别" prop="purchaseType">
+              <el-select
+                v-model="dataForm.purchaseType"
+                :disabled="display"
+                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-col>
+          <el-col :span="8" style="padding-left: 20px">
+            <el-form-item label="申请人" prop="applierId">
+              <el-input v-if="display" v-model="dataForm.applierName" disabled></el-input>
+              <el-select v-else
+                v-model="dataForm.applierId"
+                remote
+                         filterable
+                         :remote-method="remoteApplier"
+                placeholder="请选择">
+                <el-option
+                  v-for="item in optionsApplier"
+                  :key="item.code"
+                  :label="item.value"
+                  :value="item.code">
+                </el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="8" style="padding-left: 20px">
+            <el-form-item label="申请部门" prop="deptName">
+              <el-input v-model="dataForm.deptName" disabled></el-input>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row class="my-row">
+          <el-form-item label="备注" prop="notes">
+            <el-input v-model="dataForm.notes" :disabled="display" placeholder="备注"></el-input>
+          </el-form-item>
+        </el-row>
+        <div class="title"><span style="color: red">*</span> 采购物品明细</div>
+        <el-row>
+          <el-table
+            :data="materialDetails"
+            border
+            style="width: 100%;">
+            <el-table-column
+              label="序号"
+              type="index"
+              width="50"
+              align="center">
+            </el-table-column>
+            <el-table-column
+              prop="detailId"
+              label="ID"
+              v-if="false">
+            </el-table-column>
+            <el-table-column
+              prop="name"
+              header-align="center"
+              align="center"
+              min-width="120"
+              label="物品名称">
+            </el-table-column>
+            <el-table-column
+              prop="specification"
+              header-align="center"
+              align="center"
+              min-width="120"
+              label="型号及规格">
+            </el-table-column>
+            <el-table-column
+              prop="cnt"
+              header-align="center"
+              align="center"
+              label="数量">
+            </el-table-column>
+            <el-table-column
+              prop="unitName"
+              header-align="center"
+              align="center"
+              label="单位">
+            </el-table-column>
+            <el-table-column
+              prop="price"
+              header-align="center"
+              align="center"
+              label="不含税单价">
+            </el-table-column>
+            <el-table-column
+              prop="taxPrice"
+              header-align="center"
+              align="center"
+              label="含税单价">
+            </el-table-column>
+            <el-table-column
+              prop="taxAmount"
+              header-align="center"
+              align="center"
+              label="含税总价">
+            </el-table-column>
+            <el-table-column
+              prop="taxRate"
+              header-align="center"
+              align="center"
+              :formatter="formatPercent"
+              label="税率">
+            </el-table-column>
+            <el-table-column
+              prop="notes"
+              header-align="center"
+              align="center"
+              label="备注">
+            </el-table-column>
+            <el-table-column
+              v-if="!display"
+              fixed="right"
+              header-align="center"
+              align="center"
+              width="150"
+              label="操作">
+              <template slot-scope="scope">
+                <el-button type="text" size="small" @click="addMaterialHandle(scope.row.materialId, false)">编辑</el-button>
+                <el-button style="color: red" type="text" size="small" @click="deleteMaterialHandle(scope.row.materialId)">删除</el-button>
+              </template>
+            </el-table-column>
+          </el-table>
+        </el-row>
+        <el-row v-if="!display" style="text-align: center; margin-top: 10px;">
+          <el-button type="primary" icon="el-icon-plus" @click="addMaterial"></el-button>
+        </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>
+    <!-- 新增物品 -->
+    <Add v-show="addMaterialVisible" ref="comAddMaterial" @refreshDataList="getMaterialDetails"/>
+  </div>
+</template>
+
+<script>
+  import Add from './add-material'
+  import { getDictList } from '@/api/dict'
+  import { getPurchaseDetail } from '@/api/sale'
+  import { getUserList } from '@/api/user'
+  export default {
+    name: 'purchase-add-or-update',
+    components: {
+      Add
+    },
+    computed: {
+      orgId: {
+        get () { return this.$store.state.user.orgId }
+      }
+    },
+    data () {
+      return {
+        visible: false,
+        display: false,
+        dataList: [],
+        id: 0,
+        dataForm: {},
+        optionsType: [],
+        optionsApplier: [],
+        materialDetails: [],
+        addMaterialVisible: false,
+        dataRule: {
+          // drawingName: [{ required: true, message: '图纸名称不能为空', trigger: 'blur' }],
+          // source: [{ required: true, message: '图纸来源不能为空', trigger: 'blur' }]
+        }
+      }
+    },
+    methods: {
+      // 获取采购类别字典
+      getTypeList () {
+        getDictList({type: 'purchase_type'}).then(({data}) => {
+          if (data) {
+            this.optionsType = data
+          }
+        })
+      },
+      async init (id, display) {
+        this.dataForm = {
+          payType: '0'
+        }
+        this.visible = true
+        this.id = id || 0
+        this.display = display
+        // 获取采购类别字典
+        if (!id || !display) {
+          this.getTypeList()
+        }
+        if (!id) return
+        await getPurchaseDetail(this.id).then(({data}) => {
+          if (data && data.code === '200') {
+            this.dataForm = data.data
+            // 获取采购物品明细
+            if (data.data.details) {
+              this.materialDetails = []
+              this.materialDetails = data.data.details
+            }
+          }
+        })
+      },
+      validateField (type) {
+        this.$refs.dataForm.validateField(type)
+      },
+      // 表单提交
+      dataFormSubmit () {
+        this.$refs['dataForm'].validate((valid) => {
+          if (valid) {
+            this.$http({
+              url: this.$http.adornUrl(`/biz-service/purchase/save`),
+              method: 'post',
+              data: this.$http.adornData({...this.dataForm, orgId: this.orgId})
+            }).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)
+              }
+            })
+          }
+        })
+      },
+      // 获取申请人
+      async remoteApplier (query) {
+        if (!query) return
+        const params = {
+          name: query
+        }
+        await getUserList(params).then(({data}) => {
+          if (data && data.code === '200') {
+            this.optionsApplier = []
+            data.data.records.forEach((item) => {
+              this.optionsApplier.push({
+                code: item.userId,
+                value: item.name + '( 用户名: ' + item.username + ' )'
+              })
+            })
+          }
+        })
+      },
+      addMaterial () {
+        this.materialListVisible = true
+        this.$nextTick(() => {
+          this.$refs.comAddMaterial.init()
+        })
+      },
+      addMaterialHandle (id, disable) {
+        this.addMaterialVisible = true
+        this.$nextTick(() => {
+          this.$refs.comAddMaterial.init(id, disable)
+        })
+      },
+      deleteMaterialHandle (id) {
+        // if (!id) return
+      },
+      getMaterialDetails () {
+        this.addMaterialVisible = false
+        // todo
+      },
+      // 百分比
+      formatPercent (row) {
+        if (!row.taxRate) return ''
+        let str = Number(row.taxRate * 100)
+        str += '%'
+        return str
+      }
+    }
+  }
+</script>
+
+<style scoped>
+
+</style>

+ 284 - 0
src/views/modules/sale/purchase.vue

@@ -0,0 +1,284 @@
+<!-- 产品管理 -->
+<template>
+  <div class="purchase">
+    <el-form :inline="true" :model="dataForm" @keyup.enter.native="search()">
+      <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="deleteHandle(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 } from '@/api/sale'
+  export default {
+    name: 'purchase',
+    components: {
+      AddOrUpdate
+    },
+    data () {
+      return {
+        addOrUpdateVisible: false,
+        dataForm: {},
+        dataList: [],
+        pageIndex: 1,
+        pageSize: 10,
+        totalPage: 0,
+        dataListLoading: false,
+        dataListSelections: [],
+        optionsType: [],
+        optionsState: [
+          {
+            code: '0',
+            value: '未审批'
+          },
+          {
+            code: '1',
+            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
+        }
+        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
+        })
+      },
+      deleteHandle (id) {
+        if (!id) return
+        let ids = []
+        ids.push(id)
+        this.$confirm(`确定删除?`, '提示', {
+          confirmButtonText: '确定',
+          cancelButtonText: '取消',
+          type: 'warning'
+        }).then(() => {
+          this.$http({
+            url: this.$http.adornUrl(`/biz-service/product/delete`),
+            method: 'DELETE',
+            data: ids
+          }).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>

+ 0 - 1
src/views/modules/tech/product-add-or-update.vue

@@ -88,7 +88,6 @@
               </el-upload>
               <el-select v-else
                 v-model="dataForm.drawingIdList"
-                :disabled="display"
                          filterable
                          multiple
                          remote