Commit e577792690fba383bc3d2843a79960f02c47102a

Authored by wuxw
1 parent e5d43009

优化工作办理

src/api/resource/editPurchaseApplyApi.js 0 → 100644
  1 +import request from '@/utils/request'
  2 +import { getCommunityId } from '@/api/community/communityApi'
  3 +
  4 +// 获取采购申请列表
  5 +export function listPurchaseApplys(params) {
  6 + return new Promise((resolve, reject) => {
  7 + request({
  8 + url: '/purchaseApply.listPurchaseApplys',
  9 + method: 'get',
  10 + params: {
  11 + ...params,
  12 + communityId: getCommunityId()
  13 + }
  14 + }).then(response => {
  15 + const res = response.data
  16 + resolve(res)
  17 + }).catch(error => {
  18 + reject(error)
  19 + })
  20 + })
  21 +}
  22 +
  23 +// 更新采购申请
  24 +export function updatePurchaseApply(data) {
  25 + return new Promise((resolve, reject) => {
  26 + request({
  27 + url: '/purchaseApply.updatePurchaseApply',
  28 + method: 'post',
  29 + data: {
  30 + ...data,
  31 + communityId: getCommunityId()
  32 + }
  33 + }).then(response => {
  34 + const res = response.data
  35 + resolve(res)
  36 + }).catch(error => {
  37 + reject(error)
  38 + })
  39 + })
  40 +}
  41 +
  42 +// 获取仓库列表
  43 +export function listStorehouses(params) {
  44 + return new Promise((resolve, reject) => {
  45 + request({
  46 + url: '/resourceStore.listStorehouses',
  47 + method: 'get',
  48 + params: {
  49 + ...params,
  50 + communityId: getCommunityId()
  51 + }
  52 + }).then(response => {
  53 + const res = response.data
  54 + resolve(res)
  55 + }).catch(error => {
  56 + reject(error)
  57 + })
  58 + })
  59 +}
  60 +
  61 +// 获取物品类型列表
  62 +export function listResourceStoreTypes(params) {
  63 + return new Promise((resolve, reject) => {
  64 + request({
  65 + url: '/resourceStoreType.listResourceStoreTypes',
  66 + method: 'get',
  67 + params: {
  68 + ...params,
  69 + communityId: getCommunityId()
  70 + }
  71 + }).then(response => {
  72 + const res = response.data
  73 + resolve(res)
  74 + }).catch(error => {
  75 + reject(error)
  76 + })
  77 + })
  78 +}
  79 +
  80 +// 获取物品列表
  81 +export function listResourceStores(params) {
  82 + return new Promise((resolve, reject) => {
  83 + request({
  84 + url: '/resourceStore.listResourceStores',
  85 + method: 'get',
  86 + params: {
  87 + ...params,
  88 + communityId: getCommunityId()
  89 + }
  90 + }).then(response => {
  91 + const res = response.data
  92 + resolve(res)
  93 + }).catch(error => {
  94 + reject(error)
  95 + })
  96 + })
  97 +}
0 98 \ No newline at end of file
... ...
src/api/resource/myAuditOrdersApi.js 0 → 100644
  1 +import request from '@/utils/request'
  2 +
  3 +// 获取待审核订单列表
  4 +export function listAuditOrders(params) {
  5 + return new Promise((resolve, reject) => {
  6 + request({
  7 + url: '/auditUser.listAuditOrders',
  8 + method: 'get',
  9 + params
  10 + }).then(response => {
  11 + const res = response.data
  12 + resolve(res)
  13 + }).catch(error => {
  14 + reject(error)
  15 + })
  16 + })
  17 +}
  18 +
  19 +// 获取工作流步骤人员
  20 +export function listWorkflowStepStaffs(params) {
  21 + return new Promise((resolve, reject) => {
  22 + request({
  23 + url: '/workflow.listWorkflowStepStaffs',
  24 + method: 'get',
  25 + params
  26 + }).then(response => {
  27 + const res = response.data
  28 + resolve(res)
  29 + }).catch(error => {
  30 + reject(error)
  31 + })
  32 + })
  33 +}
  34 +
  35 +// 审核订单
  36 +export function auditOrderInfo(data) {
  37 + return new Promise((resolve, reject) => {
  38 + request({
  39 + url: '/auditUser.notifyAudit',
  40 + method: 'post',
  41 + data
  42 + }).then(response => {
  43 + const res = response.data
  44 + resolve(res)
  45 + }).catch(error => {
  46 + reject(error)
  47 + })
  48 + })
  49 +}
0 50 \ No newline at end of file
... ...
src/api/resource/resourceEnterManageApi.js 0 → 100644
  1 +import request from '@/utils/request'
  2 +
  3 +// 获取采购申请列表
  4 +export function listPurchaseApplys(params) {
  5 + return new Promise((resolve, reject) => {
  6 + request({
  7 + url: '/purchaseApply.listPurchaseApplys',
  8 + method: 'get',
  9 + params
  10 + }).then(response => {
  11 + const res = response.data
  12 + resolve(res)
  13 + }).catch(error => {
  14 + reject(error)
  15 + })
  16 + })
  17 +}
  18 +
  19 +// 获取供应商列表
  20 +export function listResourceSuppliers(params) {
  21 + return new Promise((resolve, reject) => {
  22 + request({
  23 + url: '/resourceSupplier.listResourceSuppliers',
  24 + method: 'get',
  25 + params
  26 + }).then(response => {
  27 + const res = response.data
  28 + resolve(res)
  29 + }).catch(error => {
  30 + reject(error)
  31 + })
  32 + })
  33 +}
  34 +
  35 +// 提交入库申请
  36 +export function resourceEnter(data) {
  37 + return new Promise((resolve, reject) => {
  38 + request({
  39 + url: '/purchase/resourceEnter',
  40 + method: 'post',
  41 + data
  42 + }).then(response => {
  43 + const res = response.data
  44 + resolve(res)
  45 + }).catch(error => {
  46 + reject(error)
  47 + })
  48 + })
  49 +}
0 50 \ No newline at end of file
... ...
src/i18n/resourceI18n.js
... ... @@ -30,6 +30,9 @@ import { messages as printAssetInventoryInStockMessages } from '../views/resourc
30 30 import { messages as returnStorehouseApplyManageMessages } from '../views/resource/returnStorehouseApplyManageLang'
31 31 import { messages as transferGoodsManageMessages } from '../views/resource/transferGoodsManageLang'
32 32 import { messages as scrapGoodsStepMessages } from '../views/resource/scrapGoodsStepLang'
  33 +import { messages as myAuditOrdersMessages } from '../views/resource/myAuditOrdersLang'
  34 +import { messages as resourceEnterManageMessages } from '../views/resource/resourceEnterManageLang'
  35 +import { messages as editPurchaseApplyMessages } from '../views/resource/editPurchaseApplyLang'
33 36  
34 37 export const messages = {
35 38 en: {
... ... @@ -64,6 +67,9 @@ export const messages = {
64 67 ...returnStorehouseApplyManageMessages.en,
65 68 ...transferGoodsManageMessages.en,
66 69 ...scrapGoodsStepMessages.en,
  70 + ...myAuditOrdersMessages.en,
  71 + ...resourceEnterManageMessages.en,
  72 + ...editPurchaseApplyMessages.en,
67 73 },
68 74 zh: {
69 75 ...resourceAuditFlowMessages.zh,
... ... @@ -97,5 +103,8 @@ export const messages = {
97 103 ...returnStorehouseApplyManageMessages.zh,
98 104 ...transferGoodsManageMessages.zh,
99 105 ...scrapGoodsStepMessages.zh,
  106 + ...myAuditOrdersMessages.zh,
  107 + ...resourceEnterManageMessages.zh,
  108 + ...editPurchaseApplyMessages.zh,
100 109 }
101 110 }
102 111 \ No newline at end of file
... ...
src/router/resourceRouter.js
... ... @@ -145,5 +145,20 @@ export default [
145 145 name: '/pages/common/scrapGoodsStep',
146 146 component: () => import('@/views/resource/scrapGoodsStepList.vue')
147 147 },
  148 + {
  149 + path: '/pages/admin/myAuditOrders',
  150 + name: '/pages/admin/myAuditOrders',
  151 + component: () => import('@/views/resource/myAuditOrdersList.vue')
  152 + },
  153 + {
  154 + path: '/views/resource/resourceEnterManage',
  155 + name: '/views/resource/resourceEnterManage',
  156 + component: () => import('@/views/resource/resourceEnterManageList.vue')
  157 + },
  158 + {
  159 + path: '/pages/resource/editPurchaseApply',
  160 + name: '/pages/resource/editPurchaseApply',
  161 + component: () => import('@/views/resource/editPurchaseApplyList.vue')
  162 + },
148 163  
149 164 ]
150 165 \ No newline at end of file
... ...
src/views/resource/editPurchaseApplyLang.js 0 → 100644
  1 +export const messages = {
  2 + en: {
  3 + editPurchaseApply: {
  4 + title: 'Edit Purchase Apply',
  5 + back: 'Back',
  6 + contactPerson: 'Contact Person',
  7 + contactPersonPlaceholder: 'Required, please enter contact person',
  8 + contactPhone: 'Contact Phone',
  9 + contactPhonePlaceholder: 'Required, please enter contact phone',
  10 + applyDescription: 'Apply Description',
  11 + applyDescriptionPlaceholder: 'Required, please enter apply description',
  12 + purchaseItems: 'Purchase Items',
  13 + select: 'Select',
  14 + itemType: 'Item Type',
  15 + itemName: 'Item Name(Code)',
  16 + itemSpec: 'Item Specification',
  17 + price: 'Price',
  18 + selectPrice: 'Select Price',
  19 + itemStock: 'Item Stock',
  20 + applyQuantity: 'Apply Quantity',
  21 + applyQuantityPlaceholder: 'Required, please enter apply quantity',
  22 + remark: 'Remark',
  23 + remarkPlaceholder: 'Optional, please enter remark',
  24 + operation: 'Operation',
  25 + remove: 'Remove',
  26 + submit: 'Submit',
  27 + noItemsSelected: 'No items selected',
  28 + updateSuccess: 'Update success',
  29 + updateFailed: 'Update failed'
  30 + }
  31 + },
  32 + zh: {
  33 + editPurchaseApply: {
  34 + title: '编辑采购申请',
  35 + back: '返回',
  36 + contactPerson: '联系人',
  37 + contactPersonPlaceholder: '必填,请填写联系人',
  38 + contactPhone: '联系电话',
  39 + contactPhonePlaceholder: '必填,请填写联系电话',
  40 + applyDescription: '申请说明',
  41 + applyDescriptionPlaceholder: '必填,请填写申请说明',
  42 + purchaseItems: '采购物品',
  43 + select: '选择',
  44 + itemType: '物品类型',
  45 + itemName: '物品名称(编码)',
  46 + itemSpec: '物品规格',
  47 + price: '价格',
  48 + selectPrice: '请选择价格',
  49 + itemStock: '物品库存',
  50 + applyQuantity: '申请数量',
  51 + applyQuantityPlaceholder: '必填,请填写申请数量',
  52 + remark: '备注',
  53 + remarkPlaceholder: '选填,请填写备注',
  54 + operation: '操作',
  55 + remove: '移除',
  56 + submit: '提交',
  57 + noItemsSelected: '未选择采购物品',
  58 + updateSuccess: '修改成功',
  59 + updateFailed: '修改失败'
  60 + }
  61 + }
  62 +}
0 63 \ No newline at end of file
... ...
src/views/resource/editPurchaseApplyList.vue 0 → 100644
  1 +<template>
  2 + <div class="edit-purchase-apply-container">
  3 + <el-card class="box-card">
  4 + <div slot="header" class="clearfix">
  5 + <span>{{ $t('editPurchaseApply.title') }}</span>
  6 + <div class="header-tools">
  7 + <el-button type="primary" size="small" @click="goBack">
  8 + <i class="el-icon-close"></i>
  9 + {{ $t('editPurchaseApply.back') }}
  10 + </el-button>
  11 + </div>
  12 + </div>
  13 +
  14 + <el-row :gutter="20">
  15 + <el-col :span="24">
  16 + <el-card>
  17 + <el-form label-width="120px">
  18 + <el-form-item :label="$t('editPurchaseApply.contactPerson')">
  19 + <el-input v-model="editPurchaseApplyInfo.endUserName"
  20 + :placeholder="$t('editPurchaseApply.contactPersonPlaceholder')" clearable>
  21 + </el-input>
  22 + </el-form-item>
  23 +
  24 + <el-form-item :label="$t('editPurchaseApply.contactPhone')">
  25 + <el-input v-model="editPurchaseApplyInfo.endUserTel"
  26 + :placeholder="$t('editPurchaseApply.contactPhonePlaceholder')" clearable>
  27 + </el-input>
  28 + </el-form-item>
  29 +
  30 + <el-form-item :label="$t('editPurchaseApply.applyDescription')">
  31 + <el-input type="textarea" v-model="editPurchaseApplyInfo.description"
  32 + :placeholder="$t('editPurchaseApply.applyDescriptionPlaceholder')" :rows="3">
  33 + </el-input>
  34 + </el-form-item>
  35 + </el-form>
  36 + </el-card>
  37 + </el-col>
  38 + </el-row>
  39 +
  40 + <el-row :gutter="20" style="margin-top: 20px;">
  41 + <el-col :span="24">
  42 + <el-card>
  43 + <div slot="header" class="clearfix">
  44 + <span>{{ $t('editPurchaseApply.purchaseItems') }}</span>
  45 + <div class="header-tools">
  46 + <el-button type="primary" size="small" @click="openSelectResourceStoreDialog">
  47 + <i class="el-icon-search"></i>
  48 + {{ $t('editPurchaseApply.select') }}
  49 + </el-button>
  50 + </div>
  51 + </div>
  52 +
  53 + <el-table :data="editPurchaseApplyInfo.resourceStores" border style="width: 100%">
  54 + <el-table-column prop="type" :label="$t('editPurchaseApply.itemType')" align="center">
  55 + <template slot-scope="scope">
  56 + {{ scope.row.parentRstName || '-' }} > {{ scope.row.rstName || '-' }}
  57 + </template>
  58 + </el-table-column>
  59 +
  60 + <el-table-column prop="name" :label="$t('editPurchaseApply.itemName')" align="center">
  61 + <template slot-scope="scope">
  62 + {{ scope.row.resName }}({{ scope.row.resCode }})
  63 + </template>
  64 + </el-table-column>
  65 +
  66 + <el-table-column prop="spec" :label="$t('editPurchaseApply.itemSpec')" align="center">
  67 + <template slot-scope="scope">
  68 + {{ scope.row.rssName || '-' }}
  69 + </template>
  70 + </el-table-column>
  71 +
  72 + <el-table-column prop="price" :label="$t('editPurchaseApply.price')" align="center">
  73 + <template slot-scope="scope">
  74 + <el-select v-model="scope.row.timesId" @change="changeTimesId($event, scope.$index)"
  75 + style="width: 100%">
  76 + <el-option :value="''" :label="$t('editPurchaseApply.selectPrice')">
  77 + </el-option>
  78 + <el-option v-for="time in scope.row.times" :key="time.timesId" :value="time.timesId"
  79 + :label="time.price">
  80 + </el-option>
  81 + </el-select>
  82 + </template>
  83 + </el-table-column>
  84 +
  85 + <el-table-column prop="stock" :label="$t('editPurchaseApply.itemStock')" align="center">
  86 + <template slot-scope="scope">
  87 + {{ getTimesStock(scope.row) }}{{ scope.row.unitCodeName }}
  88 + </template>
  89 + </el-table-column>
  90 +
  91 + <el-table-column prop="quantity" :label="$t('editPurchaseApply.applyQuantity')" align="center">
  92 + <template slot-scope="scope">
  93 + <el-input-number v-model="scope.row.quantity"
  94 + :placeholder="$t('editPurchaseApply.applyQuantityPlaceholder')" :min="1" controls-position="right"
  95 + style="width: 120px">
  96 + </el-input-number>
  97 + {{ scope.row.unitCodeName }}
  98 + </template>
  99 + </el-table-column>
  100 +
  101 + <el-table-column prop="remark" :label="$t('editPurchaseApply.remark')" align="center">
  102 + <template slot-scope="scope">
  103 + <el-input v-model="scope.row.remark" :placeholder="$t('editPurchaseApply.remarkPlaceholder')"
  104 + clearable>
  105 + </el-input>
  106 + </template>
  107 + </el-table-column>
  108 +
  109 + <el-table-column :label="$t('editPurchaseApply.operation')" align="center" width="120">
  110 + <template slot-scope="scope">
  111 + <el-button type="danger" size="mini" @click="removeSelectResourceStoreItem(scope.row.resId)">
  112 + {{ $t('editPurchaseApply.remove') }}
  113 + </el-button>
  114 + </template>
  115 + </el-table-column>
  116 + </el-table>
  117 + </el-card>
  118 + </el-col>
  119 + </el-row>
  120 +
  121 + <el-row style="margin-top: 20px;">
  122 + <el-col :span="24" style="text-align: right;">
  123 + <el-button type="primary" @click="editApplyPurchaseSummit">
  124 + <i class="el-icon-check"></i>
  125 + {{ $t('editPurchaseApply.submit') }}
  126 + </el-button>
  127 + </el-col>
  128 + </el-row>
  129 +
  130 + <choose-resource-store2 ref="chooseResourceStoreDialog" @setSelectResourceStores="handleSelectResourceStores">
  131 + </choose-resource-store2>
  132 + </el-card>
  133 + </div>
  134 +</template>
  135 +
  136 +<script>
  137 +import { getCommunityId } from '@/api/community/communityApi'
  138 +import { listPurchaseApplys, updatePurchaseApply } from '@/api/resource/editPurchaseApplyApi'
  139 +import ChooseResourceStore2 from '@/components/resource/chooseResourceStore2'
  140 +
  141 +export default {
  142 + name: 'EditPurchaseApplyList',
  143 + components: {
  144 + ChooseResourceStore2
  145 + },
  146 + data() {
  147 + return {
  148 + editPurchaseApplyInfo: {
  149 + applyOrderId: '',
  150 + resourceStores: [],
  151 + description: '',
  152 + endUserName: '',
  153 + endUserTel: '',
  154 + resOrderType: '10000',
  155 + communityId: getCommunityId()
  156 + }
  157 + }
  158 + },
  159 + created() {
  160 + this.editPurchaseApplyInfo.applyOrderId = this.$route.query.applyOrderId
  161 + this.editPurchaseApplyInfo.resOrderType = this.$route.query.resOrderType || '10000'
  162 + this.listPurchaseApply()
  163 + },
  164 + methods: {
  165 + async listPurchaseApply() {
  166 + try {
  167 + const params = {
  168 + page: 1,
  169 + row: 1,
  170 + applyOrderId: this.editPurchaseApplyInfo.applyOrderId,
  171 + resOrderType: this.editPurchaseApplyInfo.resOrderType
  172 + }
  173 + const { data } = await listPurchaseApplys(params)
  174 + if (data && data.length > 0) {
  175 + const purchaseApply = data[0]
  176 + Object.assign(this.editPurchaseApplyInfo, purchaseApply)
  177 + this.editPurchaseApplyInfo.resourceStores = purchaseApply.purchaseApplyDetailVo || []
  178 + }
  179 + } catch (error) {
  180 + console.error('获取采购申请详情失败:', error)
  181 + }
  182 + },
  183 + openSelectResourceStoreDialog() {
  184 + this.$refs.chooseResourceStoreDialog.open({
  185 + shId: this.editPurchaseApplyInfo.shId
  186 + })
  187 + },
  188 + handleSelectResourceStores(resourceStores) {
  189 + const oldList = this.editPurchaseApplyInfo.resourceStores
  190 + // 过滤重复选择的商品
  191 + const newItems = resourceStores.filter(newItem => {
  192 + return !oldList.some(oldItem => oldItem.resId === newItem.resId && (!newItem.times || newItem.times.length < 2))
  193 + })
  194 + this.editPurchaseApplyInfo.resourceStores = [...newItems, ...oldList]
  195 + },
  196 + async editApplyPurchaseSummit() {
  197 + if (!this.editPurchaseApplyInfo.resourceStores || this.editPurchaseApplyInfo.resourceStores.length === 0) {
  198 + this.$message.warning(this.$t('editPurchaseApply.noItemsSelected'))
  199 + return
  200 + }
  201 +
  202 + try {
  203 + await updatePurchaseApply(this.editPurchaseApplyInfo)
  204 + this.$message.success(this.$t('editPurchaseApply.updateSuccess'))
  205 + this.goBack()
  206 + } catch (error) {
  207 + console.error('提交采购申请失败:', error)
  208 + this.$message.error(error.message || this.$t('editPurchaseApply.updateFailed'))
  209 + }
  210 + },
  211 + removeSelectResourceStoreItem(resId) {
  212 + this.editPurchaseApplyInfo.resourceStores = this.editPurchaseApplyInfo.resourceStores.filter(
  213 + item => item.resId !== resId
  214 + )
  215 + },
  216 + changeTimesId(timesId, index) {
  217 + const times = this.editPurchaseApplyInfo.resourceStores[index].times
  218 + const selectedTime = times.find(time => time.timesId === timesId)
  219 + if (selectedTime) {
  220 + this.editPurchaseApplyInfo.resourceStores[index].selectedStock = selectedTime.stock
  221 + }
  222 + },
  223 + getTimesStock(resourceStore) {
  224 + if (!resourceStore.timesId) return '-'
  225 + if (!resourceStore.times) return 0
  226 +
  227 + const selectedTime = resourceStore.times.find(time => time.timesId === resourceStore.timesId)
  228 + return selectedTime ? selectedTime.stock : 0
  229 + },
  230 + goBack() {
  231 + this.$router.go(-1)
  232 + }
  233 + }
  234 +}
  235 +</script>
  236 +
  237 +<style lang="scss" scoped>
  238 +.edit-purchase-apply-container {
  239 + padding: 20px;
  240 +
  241 + .box-card {
  242 + margin-bottom: 20px;
  243 + }
  244 +
  245 + .header-tools {
  246 + float: right;
  247 + }
  248 +
  249 + .el-form-item {
  250 + margin-bottom: 20px;
  251 + }
  252 +
  253 + .el-select {
  254 + width: 100%;
  255 + }
  256 +}
  257 +</style>
0 258 \ No newline at end of file
... ...
src/views/resource/myAuditOrdersLang.js 0 → 100644
  1 +export const messages = {
  2 + en: {
  3 + myAuditOrders: {
  4 + todoList: 'Todo List',
  5 + back: 'Back',
  6 + refresh: 'Refresh',
  7 + orderNumber: 'Order Number',
  8 + orderType: 'Order Type',
  9 + orderStatus: 'Order Status',
  10 + applicant: 'Applicant',
  11 + createTime: 'Create Time',
  12 + operation: 'Operation',
  13 + view: 'View',
  14 + edit: 'Edit',
  15 + procurement: 'Procurement',
  16 + audit: 'Audit'
  17 + }
  18 + },
  19 + zh: {
  20 + myAuditOrders: {
  21 + todoList: '待办单',
  22 + back: '返回',
  23 + refresh: '刷新',
  24 + orderNumber: '订单号',
  25 + orderType: '订单类型',
  26 + orderStatus: '订单状态',
  27 + applicant: '申请人',
  28 + createTime: '创建时间',
  29 + operation: '操作',
  30 + view: '查看',
  31 + edit: '修改',
  32 + procurement: '采购入库',
  33 + audit: '审批'
  34 + }
  35 + }
  36 +}
0 37 \ No newline at end of file
... ...
src/views/resource/myAuditOrdersList.vue 0 → 100644
  1 +<template>
  2 + <div class="animated fadeInRight ecommerce">
  3 + <el-row>
  4 + <el-col :span="24">
  5 + <el-card>
  6 + <div slot="header" class="flex justify-between">
  7 + <div>{{ $t('myAuditOrders.todoList') }}</div>
  8 + <div class="ibox-tools" style="float: right;">
  9 + <el-button type="primary" size="small" @click="goBack">
  10 + <i class="el-icon-close"></i>
  11 + {{ $t('myAuditOrders.back') }}
  12 + </el-button>
  13 + <el-button type="primary" size="small" @click="_queryAuditOrdersMethod">
  14 + <i class="el-icon-refresh"></i>
  15 + {{ $t('myAuditOrders.refresh') }}
  16 + </el-button>
  17 + </div>
  18 + </div>
  19 + <div class="">
  20 + <el-table :data="auditOrdersInfo.auditOrders" style="width: 100%" border stripe
  21 + :default-sort="{ prop: 'createTime', order: 'descending' }">
  22 + <el-table-column prop="applyOrderId" :label="$t('myAuditOrders.orderNumber')"
  23 + align="center"></el-table-column>
  24 + <el-table-column prop="resOrderTypeName" :label="$t('myAuditOrders.orderType')"
  25 + align="center"></el-table-column>
  26 + <el-table-column prop="stateName" :label="$t('myAuditOrders.orderStatus')"
  27 + align="center"></el-table-column>
  28 + <el-table-column prop="userName" :label="$t('myAuditOrders.applicant')" align="center"></el-table-column>
  29 + <el-table-column prop="createTime" :label="$t('myAuditOrders.createTime')" align="center"
  30 + sortable></el-table-column>
  31 + <el-table-column :label="$t('myAuditOrders.operation')" align="center" width="300">
  32 + <template slot-scope="scope">
  33 + <el-button-group>
  34 + <el-button size="mini" @click="_openDetailPurchaseApplyModel(scope.row)">
  35 + {{ $t('myAuditOrders.view') }}
  36 + </el-button>
  37 + <el-button size="mini" v-if="scope.row.createUserId == auditOrdersInfo.currentUserId"
  38 + @click="_openEditPurchaseModel(scope.row)">
  39 + {{ $t('myAuditOrders.edit') }}
  40 + </el-button>
  41 + <el-button size="mini" v-if="scope.row.curTaskName == '仓库管理员'"
  42 + @click="_procureEnterOrder(scope.row)">
  43 + {{ $t('myAuditOrders.procurement') }}
  44 + </el-button>
  45 + <el-button size="mini" v-else @click="_openAuditOrderModel(scope.row)">
  46 + {{ $t('myAuditOrders.audit') }}
  47 + </el-button>
  48 + </el-button-group>
  49 + </template>
  50 + </el-table-column>
  51 + </el-table>
  52 + <el-pagination @size-change="handleSizeChange" @current-change="handleCurrentChange"
  53 + :current-page="currentPage" :page-sizes="[10, 20, 30, 50]" :page-size="pageSize"
  54 + layout="total, sizes, prev, pager, next, jumper" :total="total" style="margin-top: 20px;"></el-pagination>
  55 + </div>
  56 + </el-card>
  57 + </el-col>
  58 + </el-row>
  59 + </div>
  60 +</template>
  61 +
  62 +<script>
  63 +import { listAuditOrders, listWorkflowStepStaffs } from '@/api/resource/myAuditOrdersApi'
  64 +//import { getCommunityId } from '@/api/community/communityApi'
  65 +
  66 +export default {
  67 + name: 'MyAuditOrdersList',
  68 + data() {
  69 + return {
  70 + DEFAULT_PAGE: 1,
  71 + DEFAULT_ROWS: 10,
  72 + auditOrdersInfo: {
  73 + auditOrders: [],
  74 + total: 0,
  75 + records: 1,
  76 + moreCondition: false,
  77 + userName: '',
  78 + currentUserId: '',
  79 + conditions: {
  80 + AuditOrdersId: '',
  81 + userName: '',
  82 + auditLink: '',
  83 + page: 1,
  84 + row: 10
  85 + },
  86 + orderInfo: '',
  87 + procure: false,
  88 + audit: '1'
  89 + },
  90 + currentPage: 1,
  91 + pageSize: 10,
  92 + total: 0
  93 + }
  94 + },
  95 + created() {
  96 + this._initMethod()
  97 + },
  98 + mounted() {
  99 + this._initEvent()
  100 + },
  101 + methods: {
  102 + _initMethod() {
  103 + this._listAuditOrders(this.DEFAULT_PAGE, this.DEFAULT_ROWS)
  104 + this._loadStepStaff()
  105 + },
  106 + _initEvent() {
  107 +
  108 + },
  109 + async _listAuditOrders(_page, _rows) {
  110 + this.auditOrdersInfo.audit = '1'
  111 + this.auditOrdersInfo.conditions.page = _page
  112 + this.auditOrdersInfo.conditions.row = _rows
  113 + try {
  114 + const res = await listAuditOrders(this.auditOrdersInfo.conditions)
  115 + const _auditOrdersInfo = res.data
  116 + this.auditOrdersInfo.total = _auditOrdersInfo.total
  117 + this.auditOrdersInfo.records = _auditOrdersInfo.records
  118 + this.auditOrdersInfo.auditOrders = _auditOrdersInfo.data
  119 + this.total = _auditOrdersInfo.records
  120 + this.currentPage = _page
  121 + } catch (error) {
  122 + console.error('请求失败:', error)
  123 + }
  124 + },
  125 + _openAuditOrderModel(_purchaseApply) {
  126 + this.$router.push({
  127 + path: '/views/resource/purchaseApplyDetail',
  128 + query: {
  129 + applyOrderId: _purchaseApply.applyOrderId,
  130 + resOrderType: _purchaseApply.resOrderType,
  131 + action: 'audit',
  132 + taskId: _purchaseApply.taskId,
  133 + flowId: _purchaseApply.flowId
  134 + }
  135 + })
  136 + },
  137 + _queryAuditOrdersMethod() {
  138 + this._listAuditOrders(this.DEFAULT_PAGE, this.DEFAULT_ROWS)
  139 + },
  140 + _openDetailPurchaseApplyModel(_purchaseApply) {
  141 + this.$router.push({
  142 + path: '/views/resource/purchaseApplyDetaill',
  143 + query: {
  144 + applyOrderId: _purchaseApply.applyOrderId,
  145 + resOrderType: _purchaseApply.resOrderType
  146 + }
  147 + })
  148 + },
  149 + async _loadStepStaff() {
  150 + try {
  151 + const res = await listWorkflowStepStaffs({
  152 + page: 1,
  153 + row: 1,
  154 + staffId: this.auditOrdersInfo.currentUserId,
  155 + staffRole: '2002',
  156 + requestType: 'purchaseHandle'
  157 + })
  158 + if (res.data.length > 0) {
  159 + this.auditOrdersInfo.procure = true
  160 + }
  161 + } catch (error) {
  162 + console.error('请求失败:', error)
  163 + }
  164 + },
  165 + _procureEnterOrder(_purchaseApply) {
  166 + this.$router.push({
  167 + path: '/views/resource/resourceEnterManage',
  168 + query: {
  169 + applyOrderId: _purchaseApply.applyOrderId,
  170 + resOrderType: _purchaseApply.resOrderType,
  171 + taskId: _purchaseApply.taskId
  172 + }
  173 + })
  174 + },
  175 + _openEditPurchaseModel(_purchaseApply) {
  176 + this.$router.push({
  177 + path: '/pages/resource/editPurchaseApply',
  178 + query: {
  179 + applyOrderId: _purchaseApply.applyOrderId,
  180 + resOrderType: _purchaseApply.resOrderType
  181 + }
  182 + })
  183 + },
  184 + handleSizeChange(val) {
  185 + this.pageSize = val
  186 + this._listAuditOrders(this.currentPage, val)
  187 + },
  188 + handleCurrentChange(val) {
  189 + this.currentPage = val
  190 + this._listAuditOrders(val, this.pageSize)
  191 + },
  192 + goBack() {
  193 + this.$router.go(-1)
  194 + }
  195 + }
  196 +}
  197 +</script>
  198 +
  199 +<style lang="scss" scoped>
  200 +.ecommerce {
  201 + padding: 20px;
  202 +}
  203 +
  204 +.ibox-tools {
  205 + display: inline-block;
  206 + float: right;
  207 + margin-top: 0;
  208 + position: relative;
  209 + padding: 0;
  210 +}
  211 +
  212 +.clearfix:before,
  213 +.clearfix:after {
  214 + display: table;
  215 + content: "";
  216 +}
  217 +
  218 +.clearfix:after {
  219 + clear: both;
  220 +}
  221 +</style>
0 222 \ No newline at end of file
... ...
src/views/resource/resourceEnterManageLang.js 0 → 100644
  1 +export const messages = {
  2 + en: {
  3 + resourceEnterManage: {
  4 + orderId: 'Order ID',
  5 + itemType: 'Item Type',
  6 + itemName: 'Item Name',
  7 + itemSpec: 'Item Specification',
  8 + itemCode: 'Item Code',
  9 + itemStock: 'Item Stock',
  10 + referencePrice: 'Reference Price',
  11 + applyQuantity: 'Apply Quantity',
  12 + purchaseQuantity: 'Purchase Quantity',
  13 + purchaseQuantityPlaceholder: 'Required, please enter purchase quantity',
  14 + purchasePrice: 'Purchase Price',
  15 + purchasePricePlaceholder: 'Required, please enter purchase price',
  16 + supplier: 'Supplier',
  17 + selectSupplier: 'Please select',
  18 + remark: 'Remark',
  19 + remarkPlaceholder: 'Optional, please enter remark',
  20 + submit: 'Submit',
  21 + selectItemError: 'Please select items to enter',
  22 + purchaseQuantityError: 'Purchase quantity is required and must be positive',
  23 + purchasePriceError: 'Purchase price is required and must be positive',
  24 + submitSuccess: 'Operation successful',
  25 + submitError: 'Operation failed'
  26 + }
  27 + },
  28 + zh: {
  29 + resourceEnterManage: {
  30 + orderId: '单号',
  31 + itemType: '物品类型',
  32 + itemName: '物品名称',
  33 + itemSpec: '物品规格',
  34 + itemCode: '物品编码',
  35 + itemStock: '物品库存',
  36 + referencePrice: '参考单价',
  37 + applyQuantity: '申请数量',
  38 + purchaseQuantity: '采购数量',
  39 + purchaseQuantityPlaceholder: '必填,请填写采购数量',
  40 + purchasePrice: '采购单价',
  41 + purchasePricePlaceholder: '必填,请填写采购单价',
  42 + supplier: '供应商',
  43 + selectSupplier: '请选择',
  44 + remark: '备注',
  45 + remarkPlaceholder: '可填,请填写备注',
  46 + submit: '提交',
  47 + selectItemError: '请选择入库物品',
  48 + purchaseQuantityError: '采购数量未填写或填写不正确',
  49 + purchasePriceError: '单价未填写或填写不正确',
  50 + submitSuccess: '操作成功',
  51 + submitError: '操作失败'
  52 + }
  53 + }
  54 +}
0 55 \ No newline at end of file
... ...
src/views/resource/resourceEnterManageList.vue 0 → 100644
  1 +<template>
  2 + <div class="resource-enter-manage-container">
  3 + <el-card class="box-card">
  4 + <div slot="header" class="clearfix">
  5 + <span>{{ $t('resourceEnterManage.orderId') }}:{{resourceEnterManageInfo.applyOrderId}}</span>
  6 + </div>
  7 +
  8 + <el-row :gutter="20">
  9 + <el-col :span="24">
  10 + <el-table
  11 + :data="resourceEnterManageInfo.purchaseApplyDetailVo"
  12 + border
  13 + style="width: 100%"
  14 + class="table-wrapper"
  15 + >
  16 + <el-table-column type="selection" width="55" align="center" @selection-change="handleSelectionChange" />
  17 + <el-table-column prop="rstName" :label="$t('resourceEnterManage.itemType')" align="center">
  18 + <template slot-scope="scope">
  19 + {{scope.row.rstName || '-'}}
  20 + </template>
  21 + </el-table-column>
  22 + <el-table-column prop="resName" :label="$t('resourceEnterManage.itemName')" align="center" />
  23 + <el-table-column prop="specName" :label="$t('resourceEnterManage.itemSpec')" align="center">
  24 + <template slot-scope="scope">
  25 + {{scope.row.specName || '-'}}
  26 + </template>
  27 + </el-table-column>
  28 + <el-table-column prop="resCode" :label="$t('resourceEnterManage.itemCode')" align="center" />
  29 + <el-table-column prop="stock" :label="$t('resourceEnterManage.itemStock')" align="center" />
  30 + <el-table-column prop="standardPrice" :label="$t('resourceEnterManage.referencePrice')" align="center">
  31 + <template slot-scope="scope">
  32 + ¥{{scope.row.standardPrice}}
  33 + </template>
  34 + </el-table-column>
  35 + <el-table-column prop="quantity" :label="$t('resourceEnterManage.applyQuantity')" align="center" />
  36 + <el-table-column :label="$t('resourceEnterManage.purchaseQuantity')" align="center">
  37 + <template slot-scope="scope">
  38 + <el-input
  39 + v-model.number="scope.row.purchaseQuantity"
  40 + type="number"
  41 + :placeholder="$t('resourceEnterManage.purchaseQuantityPlaceholder')"
  42 + />
  43 + </template>
  44 + </el-table-column>
  45 + <el-table-column :label="$t('resourceEnterManage.purchasePrice')" align="center">
  46 + <template slot-scope="scope">
  47 + <el-input
  48 + v-model.number="scope.row.price"
  49 + type="number"
  50 + :placeholder="$t('resourceEnterManage.purchasePricePlaceholder')"
  51 + />
  52 + </template>
  53 + </el-table-column>
  54 + <el-table-column :label="$t('resourceEnterManage.supplier')" align="center">
  55 + <template slot-scope="scope">
  56 + <el-select
  57 + v-model="scope.row.rsId"
  58 + :placeholder="$t('resourceEnterManage.selectSupplier')"
  59 + style="width:100%"
  60 + >
  61 + <el-option
  62 + v-for="supplier in resourceEnterManageInfo.resourceSuppliers"
  63 + :key="supplier.rsId"
  64 + :label="supplier.supplierName"
  65 + :value="supplier.rsId"
  66 + />
  67 + </el-select>
  68 + </template>
  69 + </el-table-column>
  70 + <el-table-column :label="$t('resourceEnterManage.remark')" align="center">
  71 + <template slot-scope="scope">
  72 + <el-input
  73 + v-model="scope.row.purchaseRemark"
  74 + type="text"
  75 + :placeholder="$t('resourceEnterManage.remarkPlaceholder')"
  76 + />
  77 + </template>
  78 + </el-table-column>
  79 + </el-table>
  80 + </el-col>
  81 + </el-row>
  82 +
  83 + <el-row :gutter="20" class="footer-wrapper">
  84 + <el-col :span="22" :offset="2">
  85 + <el-button type="primary" @click="handleSubmit">{{ $t('resourceEnterManage.submit') }}</el-button>
  86 + </el-col>
  87 + </el-row>
  88 + </el-card>
  89 + </div>
  90 +</template>
  91 +
  92 +<script>
  93 +import { listPurchaseApplys, listResourceSuppliers, resourceEnter } from '@/api/resource/resourceEnterManageApi'
  94 +
  95 +export default {
  96 + name: 'ResourceEnterManageList',
  97 + data() {
  98 + return {
  99 + resourceEnterManageInfo: {
  100 + purchaseApplyDetailVo: [],
  101 + resourceSuppliers: [],
  102 + selectResIds: [],
  103 + applyOrderId: '',
  104 + taskId: '',
  105 + resOrderType: ''
  106 + }
  107 + }
  108 + },
  109 + created() {
  110 + this.resourceEnterManageInfo.applyOrderId = this.$route.query.applyOrderId
  111 + this.resourceEnterManageInfo.resOrderType = this.$route.query.resOrderType
  112 + this.resourceEnterManageInfo.taskId = this.$route.query.taskId
  113 + this.loadData()
  114 + },
  115 + methods: {
  116 + async loadData() {
  117 + await this.listPurchaseApply()
  118 + await this.loadResourceSuppliers()
  119 + },
  120 + async listPurchaseApply() {
  121 + try {
  122 + const params = {
  123 + page: 1,
  124 + row: 10,
  125 + applyOrderId: this.resourceEnterManageInfo.applyOrderId,
  126 + resOrderType: this.resourceEnterManageInfo.resOrderType
  127 + }
  128 + const { data } = await listPurchaseApplys(params)
  129 + const purchaseApply = data.purchaseApplys[0]
  130 + Object.assign(this.resourceEnterManageInfo, purchaseApply)
  131 + this.resourceEnterManageInfo.purchaseApplyDetailVo.forEach(item => {
  132 + item.purchaseQuantity = ''
  133 + item.price = ''
  134 + item.purchaseRemark = ''
  135 + item.rsId = ''
  136 + })
  137 + } catch (error) {
  138 + console.error('Failed to load purchase apply:', error)
  139 + }
  140 + },
  141 + async loadResourceSuppliers() {
  142 + try {
  143 + const params = { page: 1, row: 50 }
  144 + const { data } = await listResourceSuppliers(params)
  145 + this.resourceEnterManageInfo.resourceSuppliers = data
  146 + } catch (error) {
  147 + console.error('Failed to load resource suppliers:', error)
  148 + }
  149 + },
  150 + handleSelectionChange(selection) {
  151 + this.resourceEnterManageInfo.selectResIds = selection.map(item => item.resId)
  152 + },
  153 + async handleSubmit() {
  154 + // Validation
  155 + let msg = ''
  156 + const selectedItems = this.resourceEnterManageInfo.purchaseApplyDetailVo.filter(item =>
  157 + this.resourceEnterManageInfo.selectResIds.includes(item.resId)
  158 + )
  159 +
  160 + if (selectedItems.length < 1) {
  161 + this.$message.error(this.$t('resourceEnterManage.selectItemError'))
  162 + return
  163 + }
  164 +
  165 + for (const item of selectedItems) {
  166 + if (!item.purchaseQuantity || parseInt(item.purchaseQuantity) < 0) {
  167 + msg = this.$t('resourceEnterManage.purchaseQuantityError')
  168 + break
  169 + }
  170 + item.purchaseQuantity = parseInt(item.purchaseQuantity)
  171 +
  172 + if (!item.price || parseFloat(item.price) <= 0) {
  173 + msg = this.$t('resourceEnterManage.purchasePriceError')
  174 + break
  175 + }
  176 + item.price = parseFloat(item.price)
  177 + }
  178 +
  179 + if (msg) {
  180 + this.$message.error(msg)
  181 + return
  182 + }
  183 +
  184 + try {
  185 + const response = await resourceEnter(this.resourceEnterManageInfo)
  186 + if (response.code === 0) {
  187 + this.$message.success(this.$t('resourceEnterManage.submitSuccess'))
  188 + this.$router.go(-1)
  189 + } else {
  190 + this.$message.error(response.msg)
  191 + }
  192 + } catch (error) {
  193 + console.error('Submit failed:', error)
  194 + this.$message.error(this.$t('resourceEnterManage.submitError'))
  195 + }
  196 + }
  197 + }
  198 +}
  199 +</script>
  200 +
  201 +<style lang="scss" scoped>
  202 +.resource-enter-manage-container {
  203 + padding: 20px;
  204 +
  205 + .box-card {
  206 + margin-bottom: 20px;
  207 + }
  208 +
  209 + .table-wrapper {
  210 + margin-top: 20px;
  211 + }
  212 +
  213 + .footer-wrapper {
  214 + margin-top: 20px;
  215 + text-align: right;
  216 + }
  217 +}
  218 +</style>
0 219 \ No newline at end of file
... ...