Commit 79e52c9267696149a79253c3b83960a2c01bda17

Authored by wuxw
1 parent c8004a7b

采购盘点功能开发完成

src/api/resource/assetInventoryAuditApi.js 0 → 100644
  1 +import request from '@/utils/request'
  2 +
  3 +// 获取盘点详情
  4 +export function getAssetInventoryDetail(params) {
  5 + return new Promise((resolve, reject) => {
  6 + request({
  7 + url: '/assetInventory.listAssetInventory',
  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 getAssetInventoryProduct(params) {
  21 + return new Promise((resolve, reject) => {
  22 + request({
  23 + url: '/assetInventoryDetail.listAssetInventoryWholeDetail',
  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 updateAssetInventory(data) {
  37 + return new Promise((resolve, reject) => {
  38 + request({
  39 + url: '/assetInventory.updateAssetInventory',
  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 \ No newline at end of file 50 \ No newline at end of file
src/api/resource/assetInventoryEditApi.js 0 → 100644
  1 +import request from '@/utils/request'
  2 +import { getCommunityId } from '@/api/community/communityApi'
  3 +
  4 +// 获取盘点详情
  5 +export function getAssetInventoryDetail(params) {
  6 + return new Promise((resolve, reject) => {
  7 + request({
  8 + url: '/assetInventory.listAssetInventory',
  9 + method: 'get',
  10 + params: {
  11 + ...params,
  12 + communityId: getCommunityId()
  13 + }
  14 + }).then(response => {
  15 + resolve(response.data)
  16 + }).catch(error => {
  17 + reject(error)
  18 + })
  19 + })
  20 +}
  21 +
  22 +// 获取盘点商品列表
  23 +export function listAssetInventoryWholeDetail(params) {
  24 + return new Promise((resolve, reject) => {
  25 + request({
  26 + url: '/assetInventoryDetail.listAssetInventoryWholeDetail',
  27 + method: 'get',
  28 + params: {
  29 + ...params,
  30 + communityId: getCommunityId()
  31 + }
  32 + }).then(response => {
  33 + resolve(response.data)
  34 + }).catch(error => {
  35 + reject(error)
  36 + })
  37 + })
  38 +}
  39 +
  40 +// 更新盘点信息
  41 +export function updateAssetInventory(data) {
  42 + return new Promise((resolve, reject) => {
  43 + request({
  44 + url: '/assetInventory.updateAssetInventory',
  45 + method: 'post',
  46 + data: {
  47 + ...data,
  48 + communityId: getCommunityId()
  49 + }
  50 + }).then(response => {
  51 + resolve(response.data)
  52 + }).catch(error => {
  53 + reject(error)
  54 + })
  55 + })
  56 +}
  57 +
  58 +// 获取物品列表
  59 +export function listResourceStores(params) {
  60 + return new Promise((resolve, reject) => {
  61 + request({
  62 + url: '/resourceStore.listResourceStores',
  63 + method: 'get',
  64 + params: {
  65 + ...params,
  66 + communityId: getCommunityId()
  67 + }
  68 + }).then(response => {
  69 + resolve(response.data)
  70 + }).catch(error => {
  71 + reject(error)
  72 + })
  73 + })
  74 +}
  75 +
  76 +// 获取仓库列表
  77 +export function listStorehouses(params) {
  78 + return new Promise((resolve, reject) => {
  79 + request({
  80 + url: '/resourceStore.listStorehouses',
  81 + method: 'get',
  82 + params: {
  83 + ...params,
  84 + communityId: getCommunityId()
  85 + }
  86 + }).then(response => {
  87 + resolve(response.data)
  88 + }).catch(error => {
  89 + reject(error)
  90 + })
  91 + })
  92 +}
  93 +
  94 +// 获取物品类型列表
  95 +export function listResourceStoreTypes(params) {
  96 + return new Promise((resolve, reject) => {
  97 + request({
  98 + url: '/resourceStoreType.listResourceStoreTypes',
  99 + method: 'get',
  100 + params: {
  101 + ...params,
  102 + communityId: getCommunityId()
  103 + }
  104 + }).then(response => {
  105 + resolve(response.data)
  106 + }).catch(error => {
  107 + reject(error)
  108 + })
  109 + })
  110 +}
0 \ No newline at end of file 111 \ No newline at end of file
src/api/resource/assetInventoryInApi.js 0 → 100644
  1 +import request from '@/utils/request'
  2 +
  3 +// 获取仓库列表
  4 +export function listStorehouses(params) {
  5 + return new Promise((resolve, reject) => {
  6 + request({
  7 + url: '/resourceStore.listStorehouses',
  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 listResourceStores(params) {
  21 + return new Promise((resolve, reject) => {
  22 + request({
  23 + url: '/resourceStore.listResourceStores',
  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 listResourceStoreTypes(params) {
  37 + return new Promise((resolve, reject) => {
  38 + request({
  39 + url: '/resourceStoreType.listResourceStoreTypes',
  40 + method: 'get',
  41 + params
  42 + }).then(response => {
  43 + const res = response.data
  44 + resolve(res)
  45 + }).catch(error => {
  46 + reject(error)
  47 + })
  48 + })
  49 +}
  50 +
  51 +// 保存资产盘点
  52 +export function saveAssetInventory(data) {
  53 + return new Promise((resolve, reject) => {
  54 + request({
  55 + url: '/assetInventory.saveAssetInventory',
  56 + method: 'post',
  57 + data
  58 + }).then(response => {
  59 + const res = response.data
  60 + resolve(res)
  61 + }).catch(error => {
  62 + reject(error)
  63 + })
  64 + })
  65 +}
0 \ No newline at end of file 66 \ No newline at end of file
src/api/resource/assetInventoryInStockApi.js 0 → 100644
  1 +import request from '@/utils/request'
  2 +
  3 +// 获取盘点信息列表
  4 +export function getAssetInventoryList(params) {
  5 + return new Promise((resolve, reject) => {
  6 + request({
  7 + url: '/assetInventory.listAssetInventory',
  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 listAssetInventoryWholeDetail(params) {
  21 + return new Promise((resolve, reject) => {
  22 + request({
  23 + url: '/assetInventoryDetail.listAssetInventoryWholeDetail',
  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 +}
0 \ No newline at end of file 34 \ No newline at end of file
src/api/resource/printAssetInventoryInStockApi.js 0 → 100644
  1 +import request from '@/utils/request'
  2 +
  3 +// 获取盘点单列表
  4 +export function getAssetInventoryList(params) {
  5 + return new Promise((resolve, reject) => {
  6 + request({
  7 + url: '/assetInventory.listAssetInventory',
  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 getAssetInventoryDetailList(params) {
  21 + return new Promise((resolve, reject) => {
  22 + request({
  23 + url: '/assetInventoryDetail.listAssetInventoryWholeDetail',
  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 +}
0 \ No newline at end of file 34 \ No newline at end of file
src/i18n/resourceI18n.js
@@ -22,7 +22,11 @@ import { messages as printEquipmentAccountLabelMessages } from '../views/resourc @@ -22,7 +22,11 @@ import { messages as printEquipmentAccountLabelMessages } from '../views/resourc
22 import { messages as resourceDetailMessages } from '../views/resource/resourceDetailLang' 22 import { messages as resourceDetailMessages } from '../views/resource/resourceDetailLang'
23 import { messages as allocationStorehouseDetailMessages } from '../views/resource/allocationStorehouseDetailLang' 23 import { messages as allocationStorehouseDetailMessages } from '../views/resource/allocationStorehouseDetailLang'
24 import { messages as printAllocationStorehouseMessages } from '../views/resource/printAllocationStorehouseLang' 24 import { messages as printAllocationStorehouseMessages } from '../views/resource/printAllocationStorehouseLang'
25 - 25 +import { messages as assetInventoryInMessages } from '../views/resource/assetInventoryInLang'
  26 +import { messages as assetInventoryInStockMessages } from '../views/resource/assetInventoryInStockLang'
  27 +import { messages as assetInventoryEditMessages } from '../views/resource/assetInventoryEditLang'
  28 +import { messages as assetInventoryAuditMessages } from '../views/resource/assetInventoryAuditLang'
  29 +import { messages as printAssetInventoryInStockMessages } from '../views/resource/printAssetInventoryInStockLang'
26 30
27 export const messages = { 31 export const messages = {
28 en: { 32 en: {
@@ -49,6 +53,11 @@ export const messages = { @@ -49,6 +53,11 @@ export const messages = {
49 ...resourceDetailMessages.en, 53 ...resourceDetailMessages.en,
50 ...allocationStorehouseDetailMessages.en, 54 ...allocationStorehouseDetailMessages.en,
51 ...printAllocationStorehouseMessages.en, 55 ...printAllocationStorehouseMessages.en,
  56 + ...assetInventoryInMessages.en,
  57 + ...assetInventoryInStockMessages.en,
  58 + ...assetInventoryEditMessages.en,
  59 + ...assetInventoryAuditMessages.en,
  60 + ...printAssetInventoryInStockMessages.en,
52 }, 61 },
53 zh: { 62 zh: {
54 ...resourceAuditFlowMessages.zh, 63 ...resourceAuditFlowMessages.zh,
@@ -74,5 +83,10 @@ export const messages = { @@ -74,5 +83,10 @@ export const messages = {
74 ...resourceDetailMessages.zh, 83 ...resourceDetailMessages.zh,
75 ...allocationStorehouseDetailMessages.zh, 84 ...allocationStorehouseDetailMessages.zh,
76 ...printAllocationStorehouseMessages.zh, 85 ...printAllocationStorehouseMessages.zh,
  86 + ...assetInventoryInMessages.zh,
  87 + ...assetInventoryInStockMessages.zh,
  88 + ...assetInventoryEditMessages.zh,
  89 + ...assetInventoryAuditMessages.zh,
  90 + ...printAssetInventoryInStockMessages.zh,
77 } 91 }
78 } 92 }
79 \ No newline at end of file 93 \ No newline at end of file
src/router/index.js
@@ -719,6 +719,11 @@ const routes = [ @@ -719,6 +719,11 @@ const routes = [
719 name:'/pages/property/printAllocationStorehouse', 719 name:'/pages/property/printAllocationStorehouse',
720 component: () => import('@/views/resource/printAllocationStorehouseList.vue') 720 component: () => import('@/views/resource/printAllocationStorehouseList.vue')
721 }, 721 },
  722 + {
  723 + path:'/pages/property/printAssetInventoryInStock',
  724 + name:'/pages/property/printAssetInventoryInStock',
  725 + component: () => import('@/views/resource/printAssetInventoryInStockList.vue')
  726 + },
722 ] 727 ]
723 728
724 const router = new VueRouter({ 729 const router = new VueRouter({
src/router/resourceRouter.js
@@ -110,5 +110,25 @@ export default [ @@ -110,5 +110,25 @@ export default [
110 name: '/pages/common/allocationStorehouseDetail', 110 name: '/pages/common/allocationStorehouseDetail',
111 component: () => import('@/views/resource/allocationStorehouseDetailList.vue') 111 component: () => import('@/views/resource/allocationStorehouseDetailList.vue')
112 }, 112 },
  113 + {
  114 + path: '/pages/property/assetInventoryIn',
  115 + name: '/pages/property/assetInventoryIn',
  116 + component: () => import('@/views/resource/assetInventoryInList.vue')
  117 + },
  118 + {
  119 + path: '/pages/property/assetInventoryInStock',
  120 + name: '/pages/property/assetInventoryInStock',
  121 + component: () => import('@/views/resource/assetInventoryInStockList.vue')
  122 + },
  123 + {
  124 + path: '/pages/property/assetInventoryEdit',
  125 + name: '/pages/property/assetInventoryEdit',
  126 + component: () => import('@/views/resource/assetInventoryEditList.vue')
  127 + },
  128 + {
  129 + path: '/pages/property/assetInventoryAudit',
  130 + name: '/pages/property/assetInventoryAudit',
  131 + component: () => import('@/views/resource/assetInventoryAuditList.vue')
  132 + },
113 133
114 ] 134 ]
115 \ No newline at end of file 135 \ No newline at end of file
src/views/resource/assetInventoryAuditLang.js 0 → 100644
  1 +export const messages = {
  2 + en: {
  3 + assetInventoryAudit: {
  4 + inventoryInfo: 'Inventory Information',
  5 + inventoryProducts: 'Inventory Products',
  6 + auditOpinion: 'Audit Opinion',
  7 + inventoryName: 'Inventory Name',
  8 + inventoryPerson: 'Inventory Person',
  9 + warehouse: 'Warehouse',
  10 + inventoryDate: 'Inventory Date',
  11 + remark: 'Remark',
  12 + productType: 'Product Type',
  13 + productName: 'Product Name',
  14 + specification: 'Specification',
  15 + productCode: 'Product Code',
  16 + isFixed: 'Is Fixed',
  17 + referencePrice: 'Reference Price',
  18 + originalStock: 'Original Stock',
  19 + afterInventory: 'After Inventory',
  20 + opinionPlaceholder: 'Required, please enter audit opinion',
  21 + opinionRequired: 'Audit opinion cannot be empty',
  22 + approve: 'Approve',
  23 + reject: 'Reject'
  24 + }
  25 + },
  26 + zh: {
  27 + assetInventoryAudit: {
  28 + inventoryInfo: '盘点信息',
  29 + inventoryProducts: '盘点商品',
  30 + auditOpinion: '审核意见',
  31 + inventoryName: '盘点名称',
  32 + inventoryPerson: '盘点人',
  33 + warehouse: '选择仓库',
  34 + inventoryDate: '盘点日期',
  35 + remark: '盘点说明',
  36 + productType: '物品类型',
  37 + productName: '物品名称',
  38 + specification: '物品规格',
  39 + productCode: '物品编码',
  40 + isFixed: '是否是固定物品',
  41 + referencePrice: '参考价格',
  42 + originalStock: '原有库存',
  43 + afterInventory: '盘点后数量',
  44 + opinionPlaceholder: '必填,请输入审核意见',
  45 + opinionRequired: '审核意见不能为空',
  46 + approve: '审核通过',
  47 + reject: '审核不通过'
  48 + }
  49 + }
  50 +}
0 \ No newline at end of file 51 \ No newline at end of file
src/views/resource/assetInventoryAuditList.vue 0 → 100644
  1 +<template>
  2 + <div class="asset-inventory-audit-container">
  3 + <el-card class="box-card">
  4 + <div slot="header" class="clearfix">
  5 + <span>{{ $t('assetInventoryAudit.inventoryInfo') }}</span>
  6 + <div style="float: right;">
  7 + <el-button type="primary" size="small" @click="_goBack()">
  8 + <i class="el-icon-close"></i>{{ $t('common.back') }}
  9 + </el-button>
  10 + </div>
  11 + </div>
  12 + <el-row>
  13 + <el-col :span="24">
  14 + <el-form label-width="120px" class="text-left">
  15 + <el-row>
  16 + <el-col :span="12">
  17 + <el-form-item :label="$t('assetInventoryAudit.inventoryName')">
  18 + <span>{{ assetInventoryAuditInfo.name }}</span>
  19 + </el-form-item>
  20 + </el-col>
  21 + <el-col :span="12">
  22 + <el-form-item :label="$t('assetInventoryAudit.inventoryPerson')">
  23 + <span>{{ assetInventoryAuditInfo.staffName }}</span>
  24 + </el-form-item>
  25 + </el-col>
  26 + </el-row>
  27 + <el-row>
  28 + <el-col :span="12">
  29 + <el-form-item :label="$t('assetInventoryAudit.warehouse')">
  30 + <span>{{ assetInventoryAuditInfo.shName }}</span>
  31 + </el-form-item>
  32 + </el-col>
  33 + <el-col :span="12">
  34 + <el-form-item :label="$t('assetInventoryAudit.inventoryDate')">
  35 + <span>{{ assetInventoryAuditInfo.invTime }}</span>
  36 + </el-form-item>
  37 + </el-col>
  38 + </el-row>
  39 + <el-row>
  40 + <el-col :span="24">
  41 + <el-form-item :label="$t('assetInventoryAudit.remark')">
  42 + <span>{{ assetInventoryAuditInfo.remark }}</span>
  43 + </el-form-item>
  44 + </el-col>
  45 + </el-row>
  46 + </el-form>
  47 + </el-col>
  48 + </el-row>
  49 + </el-card>
  50 +
  51 + <el-card class="box-card" style="margin-top: 20px;">
  52 + <div slot="header" class="clearfix">
  53 + <span>{{ $t('assetInventoryAudit.inventoryProducts') }}</span>
  54 + </div>
  55 + <el-table :data="assetInventoryAuditInfo.resourceStores" border style="width: 100%">
  56 + <el-table-column prop="parentRstName" :label="$t('assetInventoryAudit.productType')" align="center">
  57 + <template slot-scope="scope">
  58 + {{ scope.row.parentRstName ? scope.row.parentRstName : '-' }} >
  59 + {{ scope.row.rstName ? scope.row.rstName : '-' }}
  60 + </template>
  61 + </el-table-column>
  62 + <el-table-column prop="resName" :label="$t('assetInventoryAudit.productName')" align="center">
  63 + </el-table-column>
  64 + <el-table-column prop="rssName" :label="$t('assetInventoryAudit.specification')" align="center">
  65 + <template slot-scope="scope">
  66 + {{ scope.row.rssName ? scope.row.rssName : '-' }}
  67 + </template>
  68 + </el-table-column>
  69 + <el-table-column prop="resCode" :label="$t('assetInventoryAudit.productCode')" align="center">
  70 + </el-table-column>
  71 + <el-table-column prop="isFixedName" :label="$t('assetInventoryAudit.isFixed')" align="center">
  72 + </el-table-column>
  73 + <el-table-column prop="price" :label="$t('assetInventoryAudit.referencePrice')" align="center">
  74 + </el-table-column>
  75 + <el-table-column prop="originalStock" :label="$t('assetInventoryAudit.originalStock')" align="center">
  76 + <template slot-scope="scope">
  77 + {{ scope.row.originalStock }}{{ scope.row.unitCodeName }}
  78 + </template>
  79 + </el-table-column>
  80 + <el-table-column prop="quantity" :label="$t('assetInventoryAudit.afterInventory')" align="center">
  81 + <template slot-scope="scope">
  82 + {{ scope.row.quantity }}{{ scope.row.unitCodeName }}
  83 + </template>
  84 + </el-table-column>
  85 + <el-table-column prop="remark" :label="$t('assetInventoryAudit.remark')" align="center">
  86 + </el-table-column>
  87 + </el-table>
  88 + </el-card>
  89 +
  90 + <el-card class="box-card" style="margin-top: 20px;">
  91 + <div slot="header" class="clearfix">
  92 + <span>{{ $t('assetInventoryAudit.auditOpinion') }}</span>
  93 + </div>
  94 + <el-input type="textarea" :rows="4" v-model="assetInventoryAuditInfo.opinion"
  95 + :placeholder="$t('assetInventoryAudit.opinionPlaceholder')" maxlength="250" show-word-limit>
  96 + </el-input>
  97 + <div style="margin-top: 20px; text-align: center;">
  98 + <el-button type="primary" @click="_doAssetInventory('4000')">
  99 + <i class="el-icon-check"></i>{{ $t('assetInventoryAudit.approve') }}
  100 + </el-button>
  101 + <el-button type="warning" style="margin-left: 20px;" @click="_doAssetInventory('3000')">
  102 + <i class="el-icon-close"></i>{{ $t('assetInventoryAudit.reject') }}
  103 + </el-button>
  104 + </div>
  105 + </el-card>
  106 + </div>
  107 +</template>
  108 +
  109 +<script>
  110 +import { getAssetInventoryDetail, updateAssetInventory ,getAssetInventoryProduct} from '@/api/resource/assetInventoryAuditApi'
  111 +import { getCommunityId } from '@/api/community/communityApi'
  112 +
  113 +export default {
  114 + name: 'AssetInventoryAuditList',
  115 + data() {
  116 + return {
  117 + assetInventoryAuditInfo: {
  118 + aiId: '',
  119 + shId: '',
  120 + shName: '',
  121 + name: '',
  122 + staffName: '',
  123 + invTime: '',
  124 + shopHouses: [],
  125 + resourceStores: [],
  126 + state: '2000',
  127 + remark: '',
  128 + opinion: '',
  129 + communityId: getCommunityId()
  130 + }
  131 + }
  132 + },
  133 + created() {
  134 + this.assetInventoryAuditInfo.aiId = this.$route.query.aiId
  135 + this._queryAssetInventory()
  136 + this.queryAssetInventoryProduct()
  137 + },
  138 + methods: {
  139 + async _doAssetInventory(state) {
  140 + if (!this.assetInventoryAuditInfo.opinion) {
  141 + this.$message.error(this.$t('assetInventoryAudit.opinionRequired'))
  142 + return
  143 + }
  144 + this.assetInventoryAuditInfo.state = state
  145 + try {
  146 + const res = await updateAssetInventory(this.assetInventoryAuditInfo)
  147 + if (res.code === 0) {
  148 + this.$message.success(res.msg)
  149 + this._goBack()
  150 + } else {
  151 + this.$message.error(res.msg)
  152 + }
  153 + } catch (error) {
  154 + this.$message.error(this.$t('common.requestFailed'))
  155 + }
  156 + },
  157 + _goBack() {
  158 + this.$router.go(-1)
  159 + },
  160 + async _queryAssetInventory() {
  161 + try {
  162 + const params = {
  163 + page: 1,
  164 + row: 1,
  165 + aiId: this.assetInventoryAuditInfo.aiId,
  166 + shopId: this.assetInventoryAuditInfo.communityId
  167 + }
  168 + const res = await getAssetInventoryDetail(params)
  169 + if (res.data && res.data.length > 0) {
  170 + Object.assign(this.assetInventoryAuditInfo, res.data[0])
  171 + }
  172 + } catch (error) {
  173 + console.error('请求失败:', error)
  174 + }
  175 + },
  176 + async queryAssetInventoryProduct() {
  177 + try {
  178 + const params = {
  179 + page: 1,
  180 + row: 100,
  181 + applyOrderId: this.assetInventoryAuditInfo.aiId
  182 + }
  183 + const res = await getAssetInventoryProduct(params)
  184 + if (res.data) {
  185 + res.data.forEach(item => {
  186 + this._computeData(item)
  187 + })
  188 + this.assetInventoryAuditInfo.resourceStores = res.data
  189 + }
  190 + } catch (error) {
  191 + console.error('请求失败:', error)
  192 + }
  193 + },
  194 + _computeData(item) {
  195 + item.invProfit = parseInt(item.invQuantity) - parseInt(item.quantity)
  196 + if (item.invProfit < 0) {
  197 + item.invProfit = 0
  198 + }
  199 + item.invLoss = parseInt(item.quantity) - parseInt(item.invQuantity)
  200 + if (item.invLoss < 0) {
  201 + item.invLoss = 0
  202 + }
  203 + item.invProfitMoney = item.invProfit * parseFloat(item.price)
  204 + item.invLossMoney = item.invLoss * parseFloat(item.price)
  205 + }
  206 + }
  207 +}
  208 +</script>
  209 +
  210 +<style lang="scss" scoped>
  211 +.asset-inventory-audit-container {
  212 + padding: 20px;
  213 +
  214 + .box-card {
  215 + margin-bottom: 20px;
  216 +
  217 + .clearfix {
  218 + display: flex;
  219 + justify-content: space-between;
  220 + align-items: center;
  221 + }
  222 + }
  223 +
  224 + .el-form-item {
  225 + margin-bottom: 0;
  226 +
  227 + span {
  228 + display: inline-block;
  229 + padding: 0 10px;
  230 + }
  231 + }
  232 +}
  233 +</style>
0 \ No newline at end of file 234 \ No newline at end of file
src/views/resource/assetInventoryEditLang.js 0 → 100644
  1 +export const messages = {
  2 + en: {
  3 + assetInventoryEdit: {
  4 + title: 'Inventory Edit',
  5 + inventoryInfo: 'Inventory Information',
  6 + inventoryName: 'Inventory Name',
  7 + inventoryPerson: 'Inventory Person',
  8 + warehouse: 'Warehouse',
  9 + inventoryDate: 'Inventory Date',
  10 + remark: 'Remark',
  11 + inventoryProducts: 'Inventory Products',
  12 + products: 'Products',
  13 + productType: 'Product Type',
  14 + productName: 'Product Name',
  15 + specification: 'Specification',
  16 + productCode: 'Product Code',
  17 + isFixed: 'Is Fixed',
  18 + referencePrice: 'Reference Price',
  19 + stock: 'Stock',
  20 + afterInventoryQty: 'After Inventory Qty',
  21 + requiredQty: 'Required Qty',
  22 + optionalRemark: 'Optional Remark',
  23 + selectPrice: 'Select Price',
  24 + selectWarehouseFirst: 'Please select warehouse first',
  25 + selectProductsFirst: 'Please select products first',
  26 + fillQty: 'Please fill quantity',
  27 + submitError: 'Submit failed',
  28 + fetchError: 'Failed to get inventory info',
  29 + fetchProductError: 'Failed to get product list'
  30 + }
  31 + },
  32 + zh: {
  33 + assetInventoryEdit: {
  34 + title: '盘点编辑',
  35 + inventoryInfo: '盘点信息',
  36 + inventoryName: '盘点名称',
  37 + inventoryPerson: '盘点人',
  38 + warehouse: '选择仓库',
  39 + inventoryDate: '盘点日期',
  40 + remark: '盘点说明',
  41 + inventoryProducts: '盘点商品',
  42 + products: '商品',
  43 + productType: '物品类型',
  44 + productName: '物品名称',
  45 + specification: '物品规格',
  46 + productCode: '物品编码',
  47 + isFixed: '是否是固定物品',
  48 + referencePrice: '参考价格',
  49 + stock: '物品库存',
  50 + afterInventoryQty: '盘点后数量',
  51 + requiredQty: '必填,请填盘点后数量',
  52 + optionalRemark: '选填,请填写备注',
  53 + selectPrice: '请选择价格',
  54 + selectWarehouseFirst: '请先选择仓库',
  55 + selectProductsFirst: '请选择商品',
  56 + fillQty: '请填写数量',
  57 + submitError: '提交失败',
  58 + fetchError: '获取盘点信息失败',
  59 + fetchProductError: '获取商品列表失败'
  60 + }
  61 + }
  62 +}
0 \ No newline at end of file 63 \ No newline at end of file
src/views/resource/assetInventoryEditList.vue 0 → 100644
  1 +<template>
  2 + <div class="asset-inventory-edit-container">
  3 +
  4 +
  5 + <el-row :gutter="20">
  6 + <el-col :span="24">
  7 + <el-card>
  8 + <div slot="header" class="flex justify-between">
  9 + <span>{{ $t('assetInventoryEdit.inventoryInfo') }}</span>
  10 + <div class="card-header-right">
  11 + <el-button type="primary" size="small" @click="_goBack">
  12 + <i class="el-icon-close"></i>{{ $t('common.back') }}
  13 + </el-button>
  14 + </div>
  15 + </div>
  16 + <el-form label-width="120px">
  17 + <el-row>
  18 + <el-col :span="12">
  19 + <el-form-item :label="$t('assetInventoryEdit.inventoryName')">
  20 + <el-input v-model="assetInventoryEditInfo.name" disabled></el-input>
  21 + </el-form-item>
  22 + </el-col>
  23 + <el-col :span="12">
  24 + <el-form-item :label="$t('assetInventoryEdit.inventoryPerson')">
  25 + <el-input v-model="assetInventoryEditInfo.staffName" disabled></el-input>
  26 + </el-form-item>
  27 + </el-col>
  28 + </el-row>
  29 + <el-row>
  30 + <el-col :span="12">
  31 + <el-form-item :label="$t('assetInventoryEdit.warehouse')">
  32 + <el-input v-model="assetInventoryEditInfo.shName" disabled></el-input>
  33 + </el-form-item>
  34 + </el-col>
  35 + <el-col :span="12">
  36 + <el-form-item :label="$t('assetInventoryEdit.inventoryDate')">
  37 + <el-input v-model="assetInventoryEditInfo.invTime" disabled></el-input>
  38 + </el-form-item>
  39 + </el-col>
  40 + </el-row>
  41 + <el-row>
  42 + <el-col :span="24">
  43 + <el-form-item :label="$t('assetInventoryEdit.remark')">
  44 + <el-input type="textarea" v-model="assetInventoryEditInfo.remark" disabled></el-input>
  45 + </el-form-item>
  46 + </el-col>
  47 + </el-row>
  48 + </el-form>
  49 + </el-card>
  50 + </el-col>
  51 + </el-row>
  52 +
  53 + <el-row :gutter="20" style="margin-top: 20px;">
  54 + <el-col :span="24">
  55 + <el-card>
  56 + <div slot="header" class="flex justify-between">
  57 + <span>{{ $t('assetInventoryEdit.inventoryProducts') }}</span>
  58 + <div class="card-header-right">
  59 + <el-button type="primary" size="small" @click="_openChooseProductModal">
  60 + <i class="el-icon-plus"></i>{{ $t('common.select') }}{{ $t('assetInventoryEdit.products') }}
  61 + </el-button>
  62 + </div>
  63 + </div>
  64 +
  65 + <el-table :data="assetInventoryEditInfo.resourceStores" border style="width: 100%">
  66 + <el-table-column prop="parentRstName" :label="$t('assetInventoryEdit.productType')" align="center">
  67 + <template slot-scope="scope">
  68 + {{ scope.row.parentRstName || '-' }} > {{ scope.row.rstName || '-' }}
  69 + </template>
  70 + </el-table-column>
  71 + <el-table-column prop="resName" :label="$t('assetInventoryEdit.productName')" align="center"></el-table-column>
  72 + <el-table-column prop="rssName" :label="$t('assetInventoryEdit.specification')" align="center">
  73 + <template slot-scope="scope">
  74 + {{ scope.row.rssName || '-' }}
  75 + </template>
  76 + </el-table-column>
  77 + <el-table-column prop="resCode" :label="$t('assetInventoryEdit.productCode')" align="center"></el-table-column>
  78 + <el-table-column prop="isFixedName" :label="$t('assetInventoryEdit.isFixed')" align="center"></el-table-column>
  79 + <el-table-column :label="$t('assetInventoryEdit.referencePrice')" align="center">
  80 + <template slot-scope="scope">
  81 + <el-select
  82 + v-model="scope.row.timesId"
  83 + @change="_changeTimesId($event, scope.$index)"
  84 + style="width: 100%"
  85 + >
  86 + <el-option :value="''" :label="$t('assetInventoryEdit.selectPrice')"></el-option>
  87 + <el-option
  88 + v-for="time in scope.row.times"
  89 + :key="time.timesId"
  90 + :value="time.timesId"
  91 + :label="time.price"
  92 + ></el-option>
  93 + </el-select>
  94 + </template>
  95 + </el-table-column>
  96 + <el-table-column :label="$t('assetInventoryEdit.stock')" align="center">
  97 + <template slot-scope="scope">
  98 + {{ _getTimesStock(scope.row) }}{{ scope.row.unitCodeName }}
  99 + </template>
  100 + </el-table-column>
  101 + <el-table-column :label="$t('assetInventoryEdit.afterInventoryQty')" align="center">
  102 + <template slot-scope="scope">
  103 + <el-input-number
  104 + v-model="scope.row.quantity"
  105 + :placeholder="$t('assetInventoryEdit.requiredQty')"
  106 + controls-position="right"
  107 + :min="1"
  108 + style="width: 80%"
  109 + ></el-input-number>
  110 + <span style="margin-left: 5px">{{ scope.row.unitCodeName }}</span>
  111 + </template>
  112 + </el-table-column>
  113 + <el-table-column :label="$t('assetInventoryEdit.remark')" align="center">
  114 + <template slot-scope="scope">
  115 + <el-input
  116 + v-model="scope.row.remark"
  117 + :placeholder="$t('assetInventoryEdit.optionalRemark')"
  118 + ></el-input>
  119 + </template>
  120 + </el-table-column>
  121 + <el-table-column :label="$t('common.operation')" align="center" width="120">
  122 + <template slot-scope="scope">
  123 + <el-button
  124 + type="danger"
  125 + size="mini"
  126 + @click="_removeSelectResourceStoreItem(scope.row.resId)"
  127 + >
  128 + <i class="el-icon-delete"></i>{{ $t('common.delete') }}
  129 + </el-button>
  130 + </template>
  131 + </el-table-column>
  132 + </el-table>
  133 + </el-card>
  134 + </el-col>
  135 + </el-row>
  136 +
  137 + <el-row style="margin-top: 20px;">
  138 + <el-col :span="24" style="text-align: right">
  139 + <el-button type="warning" @click="_goBack">
  140 + <i class="el-icon-close"></i>{{ $t('common.cancel') }}
  141 + </el-button>
  142 + <el-button type="primary" @click="_doAssetInventory">
  143 + <i class="el-icon-check"></i>{{ $t('common.submit') }}
  144 + </el-button>
  145 + </el-col>
  146 + </el-row>
  147 +
  148 + <choose-resource-store2
  149 + ref="chooseResourceStore2"
  150 + @setSelectResourceStores="handleSelectResourceStores"
  151 + ></choose-resource-store2>
  152 +
  153 + </div>
  154 +</template>
  155 +
  156 +<script>
  157 +import { getCommunityId } from '@/api/community/communityApi'
  158 +import {
  159 + getAssetInventoryDetail,
  160 + updateAssetInventory,
  161 + listAssetInventoryWholeDetail
  162 +} from '@/api/resource/assetInventoryEditApi'
  163 +import ChooseResourceStore2 from '@/components/resource/chooseResourceStore2'
  164 +
  165 +export default {
  166 + name: 'AssetInventoryEditList',
  167 + components: {
  168 + ChooseResourceStore2
  169 + },
  170 + data() {
  171 + return {
  172 + assetInventoryEditInfo: {
  173 + aiId: '',
  174 + shId: '',
  175 + shName: '',
  176 + name: '',
  177 + staffName: '',
  178 + invTime: '',
  179 + shopHouses: [],
  180 + resourceStores: [],
  181 + state: '2000',
  182 + remark: '',
  183 + communityId: ''
  184 + }
  185 + }
  186 + },
  187 + created() {
  188 + this.communityId = getCommunityId()
  189 + this.assetInventoryEditInfo.aiId = this.$route.query.aiId
  190 + this._queryAssetInventory()
  191 + this.queryAssetInventoryProduct()
  192 + },
  193 + methods: {
  194 + async _queryAssetInventory() {
  195 + try {
  196 + const params = {
  197 + page: 1,
  198 + row: 1,
  199 + aiId: this.assetInventoryEditInfo.aiId,
  200 + shopId: this.communityId
  201 + }
  202 + const { data } = await getAssetInventoryDetail(params)
  203 + Object.assign(this.assetInventoryEditInfo, data[0])
  204 + } catch (error) {
  205 + this.$message.error(this.$t('assetInventoryEdit.fetchError'))
  206 + }
  207 + },
  208 + async queryAssetInventoryProduct() {
  209 + try {
  210 + const params = {
  211 + page: 1,
  212 + row: 100,
  213 + applyOrderId: this.assetInventoryEditInfo.aiId
  214 + }
  215 + const { data } = await listAssetInventoryWholeDetail(params)
  216 + data.forEach(item => {
  217 + this._computeData(item)
  218 + })
  219 + this.assetInventoryEditInfo.resourceStores = data
  220 + } catch (error) {
  221 + this.$message.error(this.$t('assetInventoryEdit.fetchProductError'))
  222 + }
  223 + },
  224 + _computeData(item) {
  225 + item.invProfit = parseInt(item.invQuantity) - parseInt(item.quantity)
  226 + if (item.invProfit < 0) item.invProfit = 0
  227 +
  228 + item.invLoss = parseInt(item.quantity) - parseInt(item.invQuantity)
  229 + if (item.invLoss < 0) item.invLoss = 0
  230 +
  231 + item.invProfitMoney = item.invProfit * parseFloat(item.price)
  232 + item.invLossMoney = item.invLoss * parseFloat(item.price)
  233 + },
  234 + _openChooseProductModal() {
  235 + if (!this.assetInventoryEditInfo.shId) {
  236 + this.$message.warning(this.$t('assetInventoryEdit.selectWarehouseFirst'))
  237 + return
  238 + }
  239 + this.$refs.chooseResourceStore2.open({
  240 + shId: this.assetInventoryEditInfo.shId,
  241 + unEditFlag: true
  242 + })
  243 + },
  244 + handleSelectResourceStores(resourceStores) {
  245 + const oldList = this.assetInventoryEditInfo.resourceStores
  246 + // 过滤重复选择的商品
  247 + const newItems = resourceStores.filter(newItem =>
  248 + !oldList.some(oldItem => oldItem.resId === newItem.resId)
  249 + )
  250 + // 合并已有商品和新添加商品
  251 + this.assetInventoryEditInfo.resourceStores = [...newItems, ...oldList]
  252 + },
  253 + _removeSelectResourceStoreItem(resId) {
  254 + this.assetInventoryEditInfo.resourceStores = this.assetInventoryEditInfo.resourceStores.filter(
  255 + item => item.resId !== resId
  256 + )
  257 + this.$refs.chooseResourceStore2.removeSelectItem(resId)
  258 + },
  259 + _changeTimesId(value, index) {
  260 + const times = this.assetInventoryEditInfo.resourceStores[index].times
  261 + const selectedTime = times.find(item => item.timesId === value)
  262 + if (selectedTime) {
  263 + this.assetInventoryEditInfo.resourceStores[index].selectedStock = selectedTime.stock
  264 + }
  265 + },
  266 + _getTimesStock(resourceStore) {
  267 + if (!resourceStore.timesId) return "-"
  268 + const selectedTime = resourceStore.times.find(item => item.timesId === resourceStore.timesId)
  269 + return selectedTime ? selectedTime.stock : 0
  270 + },
  271 + async _doAssetInventory() {
  272 + const products = this.assetInventoryEditInfo.resourceStores
  273 + this.assetInventoryEditInfo.state = "2000"
  274 +
  275 + if (products.length < 1) {
  276 + this.$message.warning(this.$t('assetInventoryEdit.selectProductsFirst'))
  277 + return
  278 + }
  279 +
  280 + for (const product of products) {
  281 + if (!product.quantity || parseInt(product.quantity) <= 0) {
  282 + this.$message.warning(this.$t('assetInventoryEdit.fillQty'))
  283 + return
  284 + }
  285 + if (!product.timesId) {
  286 + this.$message.warning(`${product.resName},${this.$t('assetInventoryEdit.selectPrice')}`)
  287 + return
  288 + }
  289 + }
  290 +
  291 + try {
  292 + const { msg } = await updateAssetInventory(this.assetInventoryEditInfo)
  293 + this.$message.success(msg)
  294 + this.$router.go(-1)
  295 + } catch (error) {
  296 + this.$message.error(error.message || this.$t('assetInventoryEdit.submitError'))
  297 + }
  298 + },
  299 + _goBack() {
  300 + this.$router.go(-1)
  301 + }
  302 + }
  303 +}
  304 +</script>
  305 +
  306 +<style lang="scss" scoped>
  307 +.asset-inventory-edit-container {
  308 + padding: 20px;
  309 +
  310 + .box-card {
  311 + margin-bottom: 20px;
  312 + }
  313 +
  314 + .card-header-right {
  315 + float: right;
  316 + }
  317 +
  318 + .el-form-item {
  319 + margin-bottom: 0;
  320 + }
  321 +}
  322 +</style>
0 \ No newline at end of file 323 \ No newline at end of file
src/views/resource/assetInventoryInLang.js 0 → 100644
  1 +export const messages = {
  2 + en: {
  3 + assetInventory: {
  4 + title: 'Asset Inventory',
  5 + name: 'Inventory Name',
  6 + namePlaceholder: 'Required, please enter inventory name',
  7 + staffName: 'Inventory Staff',
  8 + staffNamePlaceholder: 'Required, please enter inventory staff name',
  9 + storehouse: 'Storehouse',
  10 + storehousePlaceholder: 'Please select storehouse',
  11 + invTime: 'Inventory Time',
  12 + invTimePlaceholder: 'Required, please select inventory time',
  13 + remark: 'Remark',
  14 + remarkPlaceholder: 'Required, please enter remark',
  15 + itemInfo: 'Item Information',
  16 + selectItem: 'Select Items',
  17 + itemType: 'Item Type',
  18 + itemName: 'Item Name',
  19 + itemSpec: 'Item Specification',
  20 + itemCode: 'Item Code',
  21 + isFixed: 'Is Fixed',
  22 + referencePrice: 'Reference Price',
  23 + selectPrice: 'Please select price',
  24 + stock: 'Stock',
  25 + afterQuantity: 'After Quantity',
  26 + afterQuantityPlaceholder: 'Required, please enter quantity after inventory',
  27 + operation: 'Operation',
  28 + remove: 'Remove',
  29 + cancel: 'Cancel',
  30 + submit: 'Submit',
  31 + validateError: 'Please complete all required fields',
  32 + selectItemError: 'Please select at least one item',
  33 + selectPriceError: 'Please select price for all items',
  34 + quantityError: 'Please enter valid quantity for all items',
  35 + nameRequired: 'Inventory name is required',
  36 + staffNameRequired: 'Inventory staff is required',
  37 + storehouseRequired: 'Storehouse is required',
  38 + invTimeRequired: 'Inventory time is required',
  39 + remarkRequired: 'Remark is required',
  40 + selectStorehouseFirst: 'Please select storehouse first',
  41 + saveError: 'Failed to save inventory'
  42 + },
  43 +
  44 + },
  45 + zh: {
  46 + assetInventory: {
  47 + title: '资产盘点',
  48 + name: '盘点名称',
  49 + namePlaceholder: '必填,请填写盘点名称',
  50 + staffName: '盘点人',
  51 + staffNamePlaceholder: '必填,请填写盘点人',
  52 + storehouse: '选择仓库',
  53 + storehousePlaceholder: '请选择仓库',
  54 + invTime: '盘点日期',
  55 + invTimePlaceholder: '必填,请填写盘点日期',
  56 + remark: '盘点说明',
  57 + remarkPlaceholder: '必填,请填写盘点说明',
  58 + itemInfo: '物品信息',
  59 + selectItem: '选择物品',
  60 + itemType: '物品类型',
  61 + itemName: '物品名称',
  62 + itemSpec: '物品规格',
  63 + itemCode: '物品编码',
  64 + isFixed: '是否是固定物品',
  65 + referencePrice: '参考价格',
  66 + selectPrice: '请选择价格',
  67 + stock: '物品库存',
  68 + afterQuantity: '盘点后数量',
  69 + afterQuantityPlaceholder: '必填,请填盘点后数量',
  70 + operation: '操作',
  71 + remove: '移除',
  72 + cancel: '取消',
  73 + submit: '提交',
  74 + validateError: '请完成所有必填项',
  75 + selectItemError: '请至少选择一件物品',
  76 + selectPriceError: '请为所有物品选择价格',
  77 + quantityError: '请为所有物品输入有效数量',
  78 + nameRequired: '盘点名称不能为空',
  79 + staffNameRequired: '盘点人不能为空',
  80 + storehouseRequired: '请选择仓库',
  81 + invTimeRequired: '盘点日期不能为空',
  82 + remarkRequired: '盘点说明不能为空',
  83 + selectStorehouseFirst: '请先选择仓库',
  84 + saveError: '保存盘点失败'
  85 + },
  86 +
  87 + }
  88 +}
0 \ No newline at end of file 89 \ No newline at end of file
src/views/resource/assetInventoryInList.vue 0 → 100644
  1 +<template>
  2 + <div class="asset-inventory-container">
  3 + <el-card class="box-card">
  4 + <div slot="header" class="flex justify-between">
  5 + <span>{{ $t('assetInventory.title') }}</span>
  6 + </div>
  7 +
  8 + <el-row :gutter="20">
  9 + <el-col :span="24">
  10 +
  11 + <el-form :model="assetInventoryInInfo" label-width="120px">
  12 + <el-row :gutter="20">
  13 + <el-col :span="12">
  14 + <el-form-item :label="$t('assetInventory.name')" prop="name">
  15 + <el-input v-model="assetInventoryInInfo.name" :placeholder="$t('assetInventory.namePlaceholder')" />
  16 + </el-form-item>
  17 + </el-col>
  18 + <el-col :span="12">
  19 + <el-form-item :label="$t('assetInventory.staffName')" prop="staffName">
  20 + <el-input v-model="assetInventoryInInfo.staffName"
  21 + :placeholder="$t('assetInventory.staffNamePlaceholder')" />
  22 + </el-form-item>
  23 + </el-col>
  24 + </el-row>
  25 +
  26 + <el-row :gutter="20">
  27 + <el-col :span="12">
  28 + <el-form-item :label="$t('assetInventory.storehouse')" prop="shId">
  29 + <el-select v-model="assetInventoryInInfo.shId"
  30 + :placeholder="$t('assetInventory.storehousePlaceholder')" style="width:100%"
  31 + @change="selectResourceStores">
  32 + <el-option v-for="item in assetInventoryInInfo.storehouses" :key="item.shId" :label="item.shName"
  33 + :value="item.shId" />
  34 + </el-select>
  35 + </el-form-item>
  36 + </el-col>
  37 + <el-col :span="12">
  38 + <el-form-item :label="$t('assetInventory.invTime')" prop="invTime">
  39 + <el-date-picker v-model="assetInventoryInInfo.invTime" type="datetime" value-format="yyyy-MM-dd HH:mm:ss"
  40 + :placeholder="$t('assetInventory.invTimePlaceholder')" style="width:100%" />
  41 + </el-form-item>
  42 + </el-col>
  43 + </el-row>
  44 +
  45 + <el-row>
  46 + <el-col :span="24">
  47 + <el-form-item :label="$t('assetInventory.remark')" prop="remark">
  48 + <el-input v-model="assetInventoryInInfo.remark" type="textarea" :rows="3"
  49 + :placeholder="$t('assetInventory.remarkPlaceholder')" maxlength="250" />
  50 + </el-form-item>
  51 + </el-col>
  52 + </el-row>
  53 + </el-form>
  54 +
  55 + </el-col>
  56 + </el-row>
  57 + </el-card>
  58 + <el-row :gutter="20" style="margin-top:20px">
  59 + <el-col :span="24">
  60 + <el-card>
  61 + <div slot="header" class="flex justify-between">
  62 + <span>{{ $t('assetInventory.itemInfo') }}</span>
  63 + <el-button v-if="assetInventoryInInfo.index != 2" type="primary" size="small" style="float:right"
  64 + @click="_openSelectResourceStoreInfoModel">
  65 + <i class="el-icon-search"></i>
  66 + {{ $t('assetInventory.selectItem') }}
  67 + </el-button>
  68 + </div>
  69 +
  70 + <el-table :data="assetInventoryInInfo.resourceStores" border style="width:100%">
  71 + <el-table-column :label="$t('assetInventory.itemType')" align="center">
  72 + <template slot-scope="scope">
  73 + {{ scope.row.parentRstName || '-' }} > {{ scope.row.rstName || '-' }}
  74 + </template>
  75 + </el-table-column>
  76 + <el-table-column prop="resName" :label="$t('assetInventory.itemName')" align="center" />
  77 + <el-table-column prop="rssName" :label="$t('assetInventory.itemSpec')" align="center">
  78 + <template slot-scope="scope">
  79 + {{ scope.row.rssName || '-' }}
  80 + </template>
  81 + </el-table-column>
  82 + <el-table-column prop="resCode" :label="$t('assetInventory.itemCode')" align="center" />
  83 + <el-table-column prop="isFixedName" :label="$t('assetInventory.isFixed')" align="center" />
  84 + <el-table-column :label="$t('assetInventory.referencePrice')" align="center">
  85 + <template slot-scope="scope">
  86 + <el-select v-model="scope.row.timesId" style="width:100%"
  87 + @change="_changeTimesId($event, scope.$index)">
  88 + <el-option value="" :label="$t('assetInventory.selectPrice')" />
  89 + <el-option v-for="time in scope.row.times" :key="time.timesId" :label="time.price"
  90 + :value="time.timesId" />
  91 + </el-select>
  92 + </template>
  93 + </el-table-column>
  94 + <el-table-column :label="$t('assetInventory.stock')" align="center">
  95 + <template slot-scope="scope">
  96 + {{ _getTimesStock(scope.row) }}{{ scope.row.unitCodeName }}
  97 + </template>
  98 + </el-table-column>
  99 + <el-table-column :label="$t('assetInventory.afterQuantity')" align="center">
  100 + <template slot-scope="scope">
  101 + <el-input-number v-model="scope.row.quantity"
  102 + :placeholder="$t('assetInventory.afterQuantityPlaceholder')" style="width:70%" :min="1" />
  103 + <span style="margin-left:5px">{{ scope.row.unitCodeName }}</span>
  104 + </template>
  105 + </el-table-column>
  106 + <el-table-column :label="$t('assetInventory.remark')" align="center">
  107 + <template slot-scope="scope">
  108 + <el-input v-model="scope.row.remark" :placeholder="$t('assetInventory.itemRemarkPlaceholder')" />
  109 + </template>
  110 + </el-table-column>
  111 + <el-table-column :label="$t('assetInventory.operation')" align="center" width="120">
  112 + <template slot-scope="scope">
  113 + <el-button type="danger" size="mini" @click="_removeSelectResourceStoreItem(scope.row.resId)">
  114 + <i class="el-icon-delete"></i>
  115 + {{ $t('assetInventory.remove') }}
  116 + </el-button>
  117 + </template>
  118 + </el-table-column>
  119 + </el-table>
  120 + </el-card>
  121 + </el-col>
  122 + </el-row>
  123 +
  124 + <el-row style="margin-top:20px">
  125 + <el-col :span="24" style="text-align:right">
  126 + <el-button type="warning" style="margin-right:20px" @click="_goBack">
  127 + <i class="el-icon-close"></i>
  128 + {{ $t('assetInventory.cancel') }}
  129 + </el-button>
  130 + <el-button type="primary" @click="_doAssetInventory">
  131 + <i class="el-icon-check"></i>
  132 + {{ $t('assetInventory.submit') }}
  133 + </el-button>
  134 + </el-col>
  135 + </el-row>
  136 +
  137 + <choose-resource-store2 ref="chooseResourceStore2" @setSelectResourceStores="handleSetSelectResourceStores" />
  138 +
  139 + </div>
  140 +</template>
  141 +
  142 +<script>
  143 +import { getCommunityId } from '@/api/community/communityApi'
  144 +import ChooseResourceStore2 from '@/components/resource/chooseResourceStore2'
  145 +import { saveAssetInventory, listStorehouses } from '@/api/resource/assetInventoryInApi'
  146 +
  147 +export default {
  148 + name: 'AssetInventoryInList',
  149 + components: {
  150 + ChooseResourceStore2
  151 + },
  152 + data() {
  153 + return {
  154 + assetInventoryInInfo: {
  155 + resourceStores: [],
  156 + shId: '',
  157 + shName: '',
  158 + invTime: '',
  159 + name: '',
  160 + staffName: '',
  161 + storehouses: [],
  162 + remark: '',
  163 + state: '2000',
  164 + communityId: ''
  165 + }
  166 + }
  167 + },
  168 + created() {
  169 + this.assetInventoryInInfo.communityId = getCommunityId()
  170 + this._listShopHouses()
  171 + },
  172 + methods: {
  173 + async _listShopHouses() {
  174 + try {
  175 + const params = {
  176 + page: 1,
  177 + row: 100,
  178 + communityId: this.assetInventoryInInfo.communityId
  179 + }
  180 + const { data } = await listStorehouses(params)
  181 + this.assetInventoryInInfo.storehouses = data
  182 + } catch (error) {
  183 + console.error('Failed to fetch storehouses:', error)
  184 + }
  185 + },
  186 + async _doAssetInventory() {
  187 + if (!this.doAssetInventoryValidate()) {
  188 + this.$message.error(this.$t('assetInventory.validateError'))
  189 + return
  190 + }
  191 +
  192 + if (this.assetInventoryInInfo.resourceStores.length < 1) {
  193 + this.$message.error(this.$t('assetInventory.selectItemError'))
  194 + return
  195 + }
  196 +
  197 + for (const item of this.assetInventoryInInfo.resourceStores) {
  198 + if (!item.timesId) {
  199 + this.$message.error(this.$t('assetInventory.selectPriceError'))
  200 + return
  201 + }
  202 + if (!item.quantity || parseInt(item.quantity) <= 0) {
  203 + this.$message.error(this.$t('assetInventory.quantityError'))
  204 + return
  205 + }
  206 + }
  207 +
  208 + try {
  209 + const res = await saveAssetInventory(this.assetInventoryInInfo)
  210 + if (res.code === 0) {
  211 + this.$message.success(res.msg)
  212 + this._goBack()
  213 + } else {
  214 + this.$message.error(res.msg)
  215 + }
  216 + } catch (error) {
  217 + console.error('Failed to save asset inventory:', error)
  218 + this.$message.error(this.$t('assetInventory.saveError'))
  219 + }
  220 + },
  221 + doAssetInventoryValidate() {
  222 + const requiredFields = [
  223 + { field: 'name', message: this.$t('assetInventory.nameRequired') },
  224 + { field: 'staffName', message: this.$t('assetInventory.staffNameRequired') },
  225 + { field: 'shId', message: this.$t('assetInventory.storehouseRequired') },
  226 + { field: 'invTime', message: this.$t('assetInventory.invTimeRequired') },
  227 + { field: 'remark', message: this.$t('assetInventory.remarkRequired') }
  228 + ]
  229 +
  230 + for (const { field, message } of requiredFields) {
  231 + if (!this.assetInventoryInInfo[field]) {
  232 + this.$message.error(message)
  233 + return false
  234 + }
  235 + }
  236 + return true
  237 + },
  238 + _goBack() {
  239 + this.$router.go(-1)
  240 + },
  241 + _openSelectResourceStoreInfoModel() {
  242 + if (!this.assetInventoryInInfo.shId) {
  243 + this.$message.error(this.$t('assetInventory.selectStorehouseFirst'))
  244 + return
  245 + }
  246 + this.$refs.chooseResourceStore2.open({
  247 + shId: this.assetInventoryInInfo.shId,
  248 + unEditFlag: true
  249 + })
  250 + },
  251 + handleSetSelectResourceStores(resourceStores) {
  252 + const oldList = this.assetInventoryInInfo.resourceStores
  253 + const newList = resourceStores.filter(newItem =>
  254 + !oldList.some(oldItem => oldItem.resId === newItem.resId)
  255 + )
  256 + this.assetInventoryInInfo.resourceStores = [...newList, ...oldList]
  257 + },
  258 + selectResourceStores() {
  259 + this.assetInventoryInInfo.resourceStores = []
  260 + const store = this.assetInventoryInInfo.storehouses.find(
  261 + item => item.shId === this.assetInventoryInInfo.shId
  262 + )
  263 + if (store) {
  264 + this.assetInventoryInInfo.shName = store.shName
  265 + }
  266 + },
  267 + _removeSelectResourceStoreItem(resId) {
  268 + this.assetInventoryInInfo.resourceStores = this.assetInventoryInInfo.resourceStores.filter(
  269 + item => item.resId !== resId
  270 + )
  271 + this.$refs.chooseResourceStore2.removeSelectItem(resId)
  272 + },
  273 + _changeTimesId(value, index) {
  274 + const times = this.assetInventoryInInfo.resourceStores[index].times
  275 + const selectedTime = times.find(item => item.timesId === value)
  276 + if (selectedTime) {
  277 + this.assetInventoryInInfo.resourceStores[index].selectedStock = selectedTime.stock
  278 + }
  279 + },
  280 + _getTimesStock(resourceStore) {
  281 + if (!resourceStore.timesId) return "-"
  282 + const time = resourceStore.times.find(item => item.timesId === resourceStore.timesId)
  283 + return time ? time.stock : 0
  284 + }
  285 + }
  286 +}
  287 +</script>
  288 +
  289 +<style lang="scss" scoped>
  290 +.asset-inventory-container {
  291 + padding: 20px;
  292 +
  293 + .box-card {
  294 + margin-bottom: 20px;
  295 + }
  296 +
  297 + .el-row {
  298 + margin-bottom: 20px;
  299 +
  300 + &:last-child {
  301 + margin-bottom: 0;
  302 + }
  303 + }
  304 +
  305 + .clearfix {
  306 + font-weight: bold;
  307 + font-size: 16px;
  308 + }
  309 +}
  310 +</style>
0 \ No newline at end of file 311 \ No newline at end of file
src/views/resource/assetInventoryInStockLang.js 0 → 100644
  1 +export const messages = {
  2 + en: {
  3 + assetInventoryInStock: {
  4 + title: 'Inventory Information',
  5 + print: 'Print',
  6 + back: 'Back',
  7 + inventoryName: 'Inventory Name',
  8 + inventoryPerson: 'Inventory Person',
  9 + warehouse: 'Warehouse',
  10 + inventoryDate: 'Inventory Date',
  11 + remark: 'Remark',
  12 + status: 'Status',
  13 + inventoryItems: 'Inventory Items',
  14 + warehouseName: 'Warehouse Name',
  15 + itemType: 'Item Type',
  16 + itemName: 'Item Name',
  17 + specification: 'Specification',
  18 + itemCode: 'Item Code',
  19 + isFixedItem: 'Is Fixed Item',
  20 + batchPrice: 'Batch Price',
  21 + originalStock: 'Original Stock',
  22 + inventoryQuantity: 'Inventory Quantity',
  23 + auditInfo: 'Audit Information',
  24 + auditor: 'Auditor',
  25 + contactNumber: 'Contact Number',
  26 + auditTime: 'Audit Time',
  27 + auditOpinion: 'Audit Opinion'
  28 + }
  29 + },
  30 + zh: {
  31 + assetInventoryInStock: {
  32 + title: '盘点信息',
  33 + print: '打印',
  34 + back: '返回',
  35 + inventoryName: '盘点名称',
  36 + inventoryPerson: '盘点人',
  37 + warehouse: '选择仓库',
  38 + inventoryDate: '盘点日期',
  39 + remark: '盘点说明',
  40 + status: '审核状态',
  41 + inventoryItems: '盘点商品',
  42 + warehouseName: '仓库名称',
  43 + itemType: '物品类型',
  44 + itemName: '物品名称',
  45 + specification: '物品规格',
  46 + itemCode: '物品编码',
  47 + isFixedItem: '是否是固定物品',
  48 + batchPrice: '批次价格',
  49 + originalStock: '原有库存',
  50 + inventoryQuantity: '盘点后数量',
  51 + auditInfo: '审核信息',
  52 + auditor: '审核人',
  53 + contactNumber: '联系电话',
  54 + auditTime: '审核时间',
  55 + auditOpinion: '审核意见'
  56 + }
  57 + }
  58 +}
0 \ No newline at end of file 59 \ No newline at end of file
src/views/resource/assetInventoryInStockList.vue 0 → 100644
  1 +<template>
  2 + <div class="asset-inventory-in-stock-container">
  3 + <el-row>
  4 + <el-col :span="24">
  5 + <el-card>
  6 + <div slot="header" class="flex justify-between">
  7 + <span>{{ $t('assetInventoryInStock.title') }}</span>
  8 + <div class="card-header-actions">
  9 + <el-button type="primary" size="small" @click="_printAssetInventoryInStock">
  10 + <i class="el-icon-printer"></i> {{ $t('assetInventoryInStock.print') }}
  11 + </el-button>
  12 + <el-button type="primary" size="small" @click="_goBack">
  13 + <i class="el-icon-close"></i> {{ $t('assetInventoryInStock.back') }}
  14 + </el-button>
  15 + </div>
  16 + </div>
  17 +
  18 + <el-row>
  19 + <el-col :span="24">
  20 + <el-form label-width="120px">
  21 + <el-row>
  22 + <el-col :span="12">
  23 + <el-form-item :label="$t('assetInventoryInStock.inventoryName')">
  24 + <el-input v-model="assetInventoryInStockInfo.name" readonly></el-input>
  25 + </el-form-item>
  26 + </el-col>
  27 + <el-col :span="12">
  28 + <el-form-item :label="$t('assetInventoryInStock.inventoryPerson')">
  29 + <el-input v-model="assetInventoryInStockInfo.staffName" readonly></el-input>
  30 + </el-form-item>
  31 + </el-col>
  32 + </el-row>
  33 +
  34 + <el-row>
  35 + <el-col :span="12">
  36 + <el-form-item :label="$t('assetInventoryInStock.warehouse')">
  37 + <el-input v-model="assetInventoryInStockInfo.shName" readonly></el-input>
  38 + </el-form-item>
  39 + </el-col>
  40 + <el-col :span="12">
  41 + <el-form-item :label="$t('assetInventoryInStock.inventoryDate')">
  42 + <el-input v-model="assetInventoryInStockInfo.invTime" readonly></el-input>
  43 + </el-form-item>
  44 + </el-col>
  45 + </el-row>
  46 +
  47 + <el-row>
  48 + <el-col :span="24">
  49 + <el-form-item :label="$t('assetInventoryInStock.remark')">
  50 + <el-input type="textarea" v-model="assetInventoryInStockInfo.remark" readonly></el-input>
  51 + </el-form-item>
  52 + </el-col>
  53 + </el-row>
  54 +
  55 + <el-row>
  56 + <el-col :span="24">
  57 + <el-form-item :label="$t('assetInventoryInStock.status')">
  58 + <el-input v-model="assetInventoryInStockInfo.stateName" readonly></el-input>
  59 + </el-form-item>
  60 + </el-col>
  61 + </el-row>
  62 + </el-form>
  63 + </el-col>
  64 + </el-row>
  65 + </el-card>
  66 + </el-col>
  67 + </el-row>
  68 +
  69 + <el-row class="mt-20">
  70 + <el-col :span="24">
  71 + <el-card>
  72 + <div slot="header" class="flex justify-between">
  73 + <span>{{ $t('assetInventoryInStock.inventoryItems') }}</span>
  74 + </div>
  75 +
  76 + <el-table :data="assetInventoryInStockInfo.storehouses" border style="width: 100%">
  77 + <el-table-column prop="shName" :label="$t('assetInventoryInStock.warehouseName')" align="center"></el-table-column>
  78 + <el-table-column :label="$t('assetInventoryInStock.itemType')" align="center">
  79 + <template slot-scope="scope">
  80 + {{ scope.row.parentRstName || '-' }} > {{ scope.row.rstName || '-' }}
  81 + </template>
  82 + </el-table-column>
  83 + <el-table-column prop="resName" :label="$t('assetInventoryInStock.itemName')" align="center"></el-table-column>
  84 + <el-table-column prop="specName" :label="$t('assetInventoryInStock.specification')" align="center">
  85 + <template slot-scope="scope">
  86 + {{ scope.row.specName || '-' }}
  87 + </template>
  88 + </el-table-column>
  89 + <el-table-column prop="resCode" :label="$t('assetInventoryInStock.itemCode')" align="center"></el-table-column>
  90 + <el-table-column prop="isFixedName" :label="$t('assetInventoryInStock.isFixedItem')" align="center"></el-table-column>
  91 + <el-table-column prop="timesPrice" :label="$t('assetInventoryInStock.batchPrice')" align="center"></el-table-column>
  92 + <el-table-column :label="$t('assetInventoryInStock.originalStock')" align="center">
  93 + <template slot-scope="scope">
  94 + {{ scope.row.originalStock }}{{ scope.row.unitCodeName }}
  95 + </template>
  96 + </el-table-column>
  97 + <el-table-column :label="$t('assetInventoryInStock.inventoryQuantity')" align="center">
  98 + <template slot-scope="scope">
  99 + {{ scope.row.quantity }}{{ scope.row.unitCodeName }}
  100 + </template>
  101 + </el-table-column>
  102 + <el-table-column prop="remark" :label="$t('assetInventoryInStock.remark')" align="center"></el-table-column>
  103 + </el-table>
  104 + </el-card>
  105 + </el-col>
  106 + </el-row>
  107 +
  108 + <el-row v-if="assetInventoryInStockInfo.state === '3000' || assetInventoryInStockInfo.state === '4000'" class="mt-20">
  109 + <el-col :span="24">
  110 + <el-card>
  111 + <div slot="header" class="clearfix">
  112 + <span>{{ $t('assetInventoryInStock.auditInfo') }}</span>
  113 + </div>
  114 +
  115 + <el-form label-width="120px">
  116 + <el-row>
  117 + <el-col :span="12">
  118 + <el-form-item :label="$t('assetInventoryInStock.auditor')">
  119 + <el-input v-model="assetInventoryInStockInfo.auditName" readonly></el-input>
  120 + </el-form-item>
  121 + </el-col>
  122 + <el-col :span="12">
  123 + <el-form-item :label="$t('assetInventoryInStock.contactNumber')">
  124 + <el-input v-model="assetInventoryInStockInfo.auditTel" readonly></el-input>
  125 + </el-form-item>
  126 + </el-col>
  127 + </el-row>
  128 +
  129 + <el-row>
  130 + <el-col :span="12">
  131 + <el-form-item :label="$t('assetInventoryInStock.auditTime')">
  132 + <el-input v-model="assetInventoryInStockInfo.auditTime" readonly></el-input>
  133 + </el-form-item>
  134 + </el-col>
  135 + <el-col :span="12">
  136 + <el-form-item :label="$t('assetInventoryInStock.auditOpinion')">
  137 + <el-input v-model="assetInventoryInStockInfo.opinion" readonly></el-input>
  138 + </el-form-item>
  139 + </el-col>
  140 + </el-row>
  141 + </el-form>
  142 + </el-card>
  143 + </el-col>
  144 + </el-row>
  145 + </div>
  146 +</template>
  147 +
  148 +<script>
  149 +import { getCommunityId } from '@/api/community/communityApi'
  150 +import { getAssetInventoryList, listAssetInventoryWholeDetail } from '@/api/resource/assetInventoryInStockApi'
  151 +
  152 +export default {
  153 + name: 'AssetInventoryInStockList',
  154 + data() {
  155 + return {
  156 + assetInventoryInStockInfo: {
  157 + aiId: '',
  158 + shId: '',
  159 + shName: '',
  160 + name: '',
  161 + staffName: '',
  162 + invTime: '',
  163 + storehouses: [],
  164 + remark: '',
  165 + stateName: '',
  166 + opinion: '',
  167 + auditId: '',
  168 + auditName: '',
  169 + auditTel: '',
  170 + auditTime: '',
  171 + state: '',
  172 + communityId: ''
  173 + }
  174 + }
  175 + },
  176 + created() {
  177 + this.communityId = getCommunityId()
  178 + this.assetInventoryInStockInfo.aiId = this.$route.query.aiId
  179 + this._queryAssetInventory()
  180 + this.queryAssetInventoryProduct()
  181 + },
  182 + methods: {
  183 + _goBack() {
  184 + this.$router.go(-1)
  185 + },
  186 + async _queryAssetInventory() {
  187 + try {
  188 + const params = {
  189 + page: 1,
  190 + row: 1,
  191 + aiId: this.assetInventoryInStockInfo.aiId,
  192 + communityId: this.communityId
  193 + }
  194 + const { data } = await getAssetInventoryList(params)
  195 + if (data && data.length > 0) {
  196 + Object.assign(this.assetInventoryInStockInfo, data[0])
  197 + }
  198 + } catch (error) {
  199 + console.error('Failed to fetch asset inventory:', error)
  200 + }
  201 + },
  202 + async queryAssetInventoryProduct() {
  203 + try {
  204 + const params = {
  205 + page: 1,
  206 + row: 100,
  207 + applyOrderId: this.assetInventoryInStockInfo.aiId,
  208 + communityId: this.communityId
  209 + }
  210 + const { data } = await listAssetInventoryWholeDetail(params)
  211 + data.forEach(item => this._computeData(item))
  212 + this.assetInventoryInStockInfo.storehouses = data
  213 + } catch (error) {
  214 + console.error('Failed to fetch inventory products:', error)
  215 + }
  216 + },
  217 + _computeData(item) {
  218 + item.invProfit = parseInt(item.invQuantity) - parseInt(item.quantity)
  219 + if (item.invProfit < 0) item.invProfit = 0
  220 +
  221 + item.invLoss = parseInt(item.quantity) - parseInt(item.invQuantity)
  222 + if (item.invLoss < 0) item.invLoss = 0
  223 +
  224 + item.invProfitMoney = item.invProfit * parseFloat(item.price)
  225 + item.invLossMoney = item.invLoss * parseFloat(item.price)
  226 + },
  227 + _printAssetInventoryInStock() {
  228 + window.open(`/print.html#/pages/property/printAssetInventoryInStock?aiId=${this.assetInventoryInStockInfo.aiId}`)
  229 + }
  230 + }
  231 +}
  232 +</script>
  233 +
  234 +<style lang="scss" scoped>
  235 +.asset-inventory-in-stock-container {
  236 + padding: 20px;
  237 +
  238 + .mt-20 {
  239 + margin-top: 20px;
  240 + }
  241 +
  242 + .card-header-actions {
  243 + float: right;
  244 + }
  245 +
  246 + .el-form-item {
  247 + margin-bottom: 0;
  248 + }
  249 +}
  250 +</style>
0 \ No newline at end of file 251 \ No newline at end of file
src/views/resource/printAssetInventoryInStockLang.js 0 → 100644
  1 +export const messages = {
  2 + en: {
  3 + printAssetInventoryInStock: {
  4 + inventoryName: 'Inventory Name',
  5 + inventoryPerson: 'Inventory Person',
  6 + warehouse: 'Warehouse',
  7 + inventoryDate: 'Inventory Date',
  8 + warehouseName: 'Warehouse Name',
  9 + itemType: 'Item Type',
  10 + itemName: 'Item Name',
  11 + specification: 'Specification',
  12 + itemCode: 'Item Code',
  13 + isFixed: 'Is Fixed',
  14 + batchPrice: 'Batch Price',
  15 + originalStock: 'Original Stock',
  16 + afterInventory: 'After Inventory',
  17 + remark: 'Remark',
  18 + warehouseManagerSign: 'Warehouse Manager Sign',
  19 + transferPersonSign: 'Transfer Person Sign',
  20 + time: 'Time'
  21 + }
  22 + },
  23 + zh: {
  24 + printAssetInventoryInStock: {
  25 + inventoryName: '盘点名称',
  26 + inventoryPerson: '盘点人',
  27 + warehouse: '选择仓库',
  28 + inventoryDate: '盘点日期',
  29 + warehouseName: '仓库名称',
  30 + itemType: '物品类型',
  31 + itemName: '物品名称',
  32 + specification: '物品规格',
  33 + itemCode: '物品编码',
  34 + isFixed: '是否是固定物品',
  35 + batchPrice: '批次价格',
  36 + originalStock: '原有库存',
  37 + afterInventory: '盘点后数量',
  38 + remark: '备注',
  39 + warehouseManagerSign: '仓库管理员签字',
  40 + transferPersonSign: '调拨人员签字',
  41 + time: '时间'
  42 + }
  43 + }
  44 +}
0 \ No newline at end of file 45 \ No newline at end of file
src/views/resource/printAssetInventoryInStockList.vue 0 → 100644
  1 +<template>
  2 + <div class="print-asset-inventory-container">
  3 +
  4 + <el-row :gutter="20">
  5 + <el-col :span="6">
  6 + <span>
  7 + <span>{{ $t('printAssetInventoryInStock.inventoryName') }}</span>:
  8 + {{ printAssetInventoryInStockInfo.conditions.name }}
  9 + </span>
  10 + </el-col>
  11 + <el-col :span="6">
  12 + <span>
  13 + <span>{{ $t('printAssetInventoryInStock.inventoryPerson') }}</span>:
  14 + {{ printAssetInventoryInStockInfo.conditions.staffName }}
  15 + </span>
  16 + </el-col>
  17 + <el-col :span="6">
  18 + <span>
  19 + <span>{{ $t('printAssetInventoryInStock.warehouse') }}</span>:
  20 + {{ printAssetInventoryInStockInfo.conditions.shName }}
  21 + </span>
  22 + </el-col>
  23 + <el-col :span="6">
  24 + <span>
  25 + <span>{{ $t('printAssetInventoryInStock.inventoryDate') }}</span>:
  26 + {{ printAssetInventoryInStockInfo.conditions.invTime }}
  27 + </span>
  28 + </el-col>
  29 + </el-row>
  30 +
  31 + <table class="table table-bordered margin-top">
  32 + <thead>
  33 + <tr>
  34 + <th scope="col" class="text-center">
  35 + {{ $t('printAssetInventoryInStock.warehouseName') }}
  36 + </th>
  37 + <th scope="col" class="text-center">
  38 + {{ $t('printAssetInventoryInStock.itemType') }}
  39 + </th>
  40 + <th scope="col" class="text-center">
  41 + {{ $t('printAssetInventoryInStock.itemName') }}
  42 + </th>
  43 + <th scope="col" class="text-center">
  44 + {{ $t('printAssetInventoryInStock.specification') }}
  45 + </th>
  46 + <th scope="col" class="text-center">
  47 + {{ $t('printAssetInventoryInStock.itemCode') }}
  48 + </th>
  49 + <th scope="col" class="text-center">
  50 + {{ $t('printAssetInventoryInStock.isFixed') }}
  51 + </th>
  52 + <th scope="col" class="text-center">
  53 + {{ $t('printAssetInventoryInStock.batchPrice') }}
  54 + </th>
  55 + <th scope="col" class="text-center">
  56 + {{ $t('printAssetInventoryInStock.originalStock') }}
  57 + </th>
  58 + <th scope="col" class="text-center">
  59 + {{ $t('printAssetInventoryInStock.afterInventory') }}
  60 + </th>
  61 + <th scope="col" class="text-center">
  62 + {{ $t('printAssetInventoryInStock.remark') }}
  63 + </th>
  64 + </tr>
  65 + </thead>
  66 + <tbody>
  67 + <tr v-for="(item, index) in printAssetInventoryInStockInfo.storehouses" :key="index">
  68 + <td class="text-center">{{ item.shName }}</td>
  69 + <td class="text-center">
  70 + {{ item.parentRstName ? item.parentRstName : '-' }} > {{ item.rstName ? item.rstName : '-' }}
  71 + </td>
  72 + <td class="text-center">{{ item.resName }}</td>
  73 + <td class="text-center">{{ item.specName ? item.specName : '-' }}</td>
  74 + <td class="text-center">{{ item.resCode }}</td>
  75 + <td class="text-center">{{ item.isFixedName }}</td>
  76 + <td class="text-center">{{ item.timesPrice }}</td>
  77 + <td class="text-center">{{ item.originalStock }}{{ item.unitCodeName }}</td>
  78 + <td class="text-center">{{ item.quantity }}{{ item.unitCodeName }}</td>
  79 + <td class="text-center">{{ item.remark }}</td>
  80 + </tr>
  81 + <tr>
  82 + <th scope="row" class="text-center">
  83 + {{ $t('printAssetInventoryInStock.remark') }}
  84 + </th>
  85 + <td colspan="9" style="text-align:center">
  86 + {{ printAssetInventoryInStockInfo.conditions.remark }}
  87 + </td>
  88 + </tr>
  89 + <tr height="60px">
  90 + <td colspan="2" class="text-center" style="vertical-align:middle;">
  91 + {{ $t('printAssetInventoryInStock.warehouseManagerSign') }}
  92 + </td>
  93 + <td colspan="2"></td>
  94 + <td class="text-center" style="vertical-align:middle;">
  95 + {{ $t('printAssetInventoryInStock.time') }}
  96 + </td>
  97 + <td colspan="5"></td>
  98 + </tr>
  99 + <tr height="60px">
  100 + <td colspan="2" class="text-center" style="vertical-align:middle;">
  101 + {{ $t('printAssetInventoryInStock.transferPersonSign') }}
  102 + </td>
  103 + <td colspan="2"></td>
  104 + <td class="text-center" style="vertical-align:middle;">
  105 + {{ $t('printAssetInventoryInStock.time') }}
  106 + </td>
  107 + <td colspan="5"></td>
  108 + </tr>
  109 + </tbody>
  110 + </table>
  111 +
  112 + <div id="print-btn">
  113 + <el-button type="primary" class="float-right" @click="_printAssetInventoryInStockDiv()">
  114 + <i class="el-icon-printer"></i>&nbsp;{{ $t('common.print') }}
  115 + </el-button>
  116 + <el-button type="warning" class="float-right" style="margin-right:20px;" @click="_closePage()">
  117 + {{ $t('common.cancel') }}
  118 + </el-button>
  119 + </div>
  120 +
  121 + </div>
  122 +</template>
  123 +
  124 +<script>
  125 +import { getAssetInventoryList, getAssetInventoryDetailList } from '@/api/resource/printAssetInventoryInStockApi'
  126 +import { getCommunityId } from '@/api/community/communityApi'
  127 +
  128 +export default {
  129 + name: 'PrintAssetInventoryInStockList',
  130 + data() {
  131 + return {
  132 + printAssetInventoryInStockInfo: {
  133 + storehouses: [],
  134 + conditions: {}
  135 + },
  136 + printFlag: '0',
  137 + communityId: ''
  138 + }
  139 + },
  140 + created() {
  141 + this.communityId = getCommunityId()
  142 + this._initPrintAssetInventoryInStockInfo()
  143 + this._listPrintAssetInventoryInStock(1, 100)
  144 + },
  145 + methods: {
  146 + async _initPrintAssetInventoryInStockInfo() {
  147 + try {
  148 + const aiId = this.$route.query.aiId
  149 + const params = {
  150 + page: 1,
  151 + row: 1,
  152 + applyId: aiId,
  153 + communityId: this.communityId
  154 + }
  155 + const { data } = await getAssetInventoryList(params)
  156 + this.printAssetInventoryInStockInfo.conditions = data[0]
  157 + } catch (error) {
  158 + console.error('请求失败:', error)
  159 + }
  160 + },
  161 + async _listPrintAssetInventoryInStock(page, rows) {
  162 + try {
  163 + const aiId = this.$route.query.aiId
  164 + const params = {
  165 + page: page,
  166 + row: rows,
  167 + applyOrderId: aiId,
  168 + communityId: this.communityId
  169 + }
  170 + const { data } = await getAssetInventoryDetailList(params)
  171 + this.printAssetInventoryInStockInfo.storehouses = data
  172 + } catch (error) {
  173 + console.error('请求失败:', error)
  174 + }
  175 + },
  176 + _printAssetInventoryInStockDiv() {
  177 + this.printFlag = '1'
  178 + document.getElementById("print-btn").style.display = "none"
  179 + window.print()
  180 + window.opener = null
  181 + window.close()
  182 + },
  183 + _closePage() {
  184 + window.opener = null
  185 + window.close()
  186 + }
  187 + }
  188 +}
  189 +</script>
  190 +
  191 +<style scoped>
  192 +.print-asset-inventory-container {
  193 + padding: 20px;
  194 +}
  195 +
  196 +.table {
  197 + width: 100%;
  198 + margin-top: 20px;
  199 + border-collapse: collapse;
  200 +}
  201 +
  202 +.table th,
  203 +.table td {
  204 + border: 1px solid #ebeef5;
  205 + padding: 12px 15px;
  206 +}
  207 +
  208 +.text-center {
  209 + text-align: center;
  210 +}
  211 +
  212 +.margin-top {
  213 + margin-top: 20px;
  214 +}
  215 +
  216 +.float-right {
  217 + float: right;
  218 +}
  219 +
  220 +#print-btn {
  221 + margin-top: 20px;
  222 + overflow: hidden;
  223 +}
  224 +</style>
0 \ No newline at end of file 225 \ No newline at end of file