Handy_Cao hace 11 meses
padre
commit
c92f9b2134

+ 25 - 1
src/business/trade/index.ts

@@ -22,7 +22,8 @@ import {
     offlineDeliveryApplyCancelOrder,
     offlineDelivery,
     modifyOrder,
-    deposiTransferOperate
+    deposiTransferOperate,
+    goodsInventoryApply
 } from '@/services/api/trade'
 import { formatDate } from "@/filters";
 import Long from 'long'
@@ -700,4 +701,27 @@ export function useDeposiTransferOperate() {
     }
 }
 
+// 用户出入库申请请求
+export function useGoodsInventoryApply() {
+    const loading = shallowRef(false)
+    const formData = reactive<Partial<Proto.GoodsInventoryApplyReq>>({})
+    const formSubmit = async () => {
+        try {
+            loading.value = true
+            return await goodsInventoryApply({
+                data: {
+                    ...formData
+                }
+            })
+        } finally {
+            loading.value = false
+        }
+    }
+
+    return {
+        loading,
+        formData,
+        formSubmit
+    }
+}
 

+ 6 - 0
src/constants/funcode.ts

@@ -153,4 +153,10 @@ export enum FunCode {
 
     DepositTransferOperateReq = 196763,   // 定金转让持仓操作请求
     DepositTransferOperateRsp = 196764,   // 定金转让持仓操作响应
+
+    GoodsInventoryApplyAuditReq = 196769, // 用户出入库审核请求
+    GoodsInventoryApplyAuditRsp = 196770, // 用户出入库审核应答
+
+    GoodsInventoryApplyReq = 196767, // 用户出入库申请请求
+    GoodsInventoryApplyRsp = 196768, // 用户出入库申请应答
 } 

+ 43 - 0
src/constants/order.ts

@@ -620,4 +620,47 @@ export function getGoodsCurrencyList() {
 export function getGoodsCurrencyName(value: number) {
     const enums = getGoodsCurrencyList()
     return getEnumTypeName(enums, value)
+}
+
+/**
+ * 获取申请状列表
+ * @returns 
+ */
+export function getInoutApplyStatusList() {
+    return getEnumTypeList('inoutapplystatus')
+}
+
+/**
+ * 获取申请状名称
+ * @returns 
+ */
+export function getInoutApplyStatusName(value: number) {
+    const enums = getInoutApplyStatusList()
+    return getEnumTypeName(enums, value)
+}
+
+/**
+ * 获取	出入库方式 - 1:邮寄 3:自提 4:配送(enum:appointmentModelOut)名称
+ * @returns 
+ */
+export function getAppointmentModelOutName(value: number) {
+    const enums = getAppointmentModelOutList()
+    return getEnumTypeName(enums, value)
+}
+
+/**
+ * 获取申请类型 - 1:入库 2:出库 (enum:inouttype)列表
+ * @returns 
+ */
+export function getInoutTypeList() {
+    return getEnumTypeList('inouttype', ['param2'])
+}
+
+/**
+ * 获取申请类型 - 1:入库 2:出库 (enum:inouttype)名称
+ * @returns 
+ */
+export function getInoutTypeName(value: number) {
+    const enums = getInoutTypeList()
+    return getEnumTypeName(enums, value)
 }

+ 14 - 0
src/packages/sbyj/router/index.ts

@@ -228,6 +228,20 @@ const routes: Array<RouteRecordRaw> = [
     ]
   },
   {
+    path: '/inventory',
+    component: Page,
+    children: [
+      {
+        path: '',
+        name: 'inventory-list',
+        component: () => import('../views/inventory/index.vue'),
+        props: {
+          title: '我的库存'
+        }
+      }
+    ]
+  },
+  {
     path: '/pickup',
     component: Page,
     children: [

+ 5 - 0
src/packages/sbyj/views/home/main/index.vue

@@ -30,6 +30,11 @@
             <Iconfont label-direction="bottom" icon="g-icon-pickup--line">提料订单</Iconfont>
           </li>
         </ul>
+        <ul>
+          <li @click="routerTo('inventory-list')">
+            <Iconfont label-direction="bottom" icon="g-icon-pickup--line">我的库存</Iconfont>
+          </li>
+        </ul>
       </app-block>
       <app-block class="home-main__news">
         <CellGroup class="article">

+ 76 - 0
src/packages/sbyj/views/inventory/components/inOut/index.vue

@@ -0,0 +1,76 @@
+<template>
+    <app-view>
+        <template #header>
+            <app-navbar :title="inOutType === 1 ? '入库申请' : '出库申请'" />
+        </template>
+        <Form ref="formRef" class="g-form__container" @submit="onSubmit">
+            <CellGroup inset>
+                <Cell title="商品" :value="`${selectedRow.goodscode}/${selectedRow.goodsname}`" />
+                <Field type="number" name="Qty" label="数量" v-model.trim="formData.Qty" placeholder="请输入数量" :rules="formRules.Qty" />
+                <Field type="textarea" maxlength="250" autosize show-word-limit name="Remark" label="备注" v-model.trim="formData.Remark" placeholder="请输入备注" />
+            </CellGroup>
+        </Form>
+        <template #footer>
+            <div class="g-form__footer inset">
+                <Button type="danger" round block @click="closed(true)">取消</Button>
+                <Button type="danger" round block @click="formRef?.submit()">确认</Button>
+            </div>
+        </template>
+    </app-view>
+</template>
+
+<script lang="ts" setup>
+import { shallowRef, PropType } from 'vue'
+import { Form, Field, Cell, CellGroup, FormInstance, Button, FieldRule } from 'vant'
+import { fullloading } from '@/utils/vant'
+import { useGoodsInventoryApply } from '@/business/trade';
+
+const showModal = shallowRef(true)
+const refresh = shallowRef(false) // 是否刷新父组件数据
+const formRef = shallowRef<FormInstance>()
+
+const { formData, formSubmit } = useGoodsInventoryApply()
+
+const props = defineProps({
+    selectedRow: {
+        type: Object as PropType<Model.UserGoodsInventoryRsp>,
+        required: true,
+    },
+    inOutType: {
+        type: Number,
+        required: true
+    }
+})
+
+// 表单验证规则
+const formRules: { [key in keyof Proto.GoodsInventoryApplyReq]?: FieldRule[] } = {
+    Qty: [{
+        message: '请输入数量',
+        required: true,
+        validator: () => {
+            return !!formData.Qty
+        }
+    }],
+}
+
+const onSubmit = () => {
+    const  { goodsid } = props.selectedRow
+    formData.InoutType = props.inOutType
+    formData.GoodsID = goodsid
+
+    fullloading((hideLoading) => {
+        formSubmit().then(() => {
+            hideLoading('提交成功', 'success')
+            closed(true)
+        }).catch((err) => {
+            hideLoading(err, 'fail')
+        })
+    })
+}
+
+// 关闭弹窗
+const closed = (isRefresh = false) => {
+    refresh.value = isRefresh
+    showModal.value = false
+}
+</script>

+ 75 - 0
src/packages/sbyj/views/inventory/components/logs/index.vue

@@ -0,0 +1,75 @@
+<template>
+    <app-view>
+        <template #header>
+            <app-navbar title="申请记录" />
+        </template>
+        <app-pull-refresh ref="pullRefreshRef" v-model:loading="loading" v-model:error="error"
+            v-model:pageIndex="pageIndex" :page-count="pageCount" @refresh="run">
+            <div class="g-order-list">
+                <div class="g-order-list__box" v-for="(item, index) in dataList" :key="index">
+                    <div class="g-order-list__titlebar">
+                        <div class="left">
+                            <h4>
+                                {{ formatDate(item.applytime) }}
+                            </h4>
+                            <span :class="item.inouttype === 1 ? 'g-price-up' : 'g-price-down'">{{ getInoutTypeName(item.inouttype) }} {{ getAppointmentModelOutName(item.inoutmodel) }}</span>
+                            <span>{{ getInoutApplyStatusName(item.applystatus) }}</span>
+                        </div>
+                    </div>
+                    <div class="g-order-list__content">
+                        <ul>
+                            <li>
+                                <span>商品:</span>
+                                <span>{{ item.goodscode }}/{{ item.goodsname }}</span>
+                            </li>
+                            <li>
+                                <span>数量:</span>
+                                <span>{{ item.qty }}{{ item.goodunit }}</span>
+                            </li>
+                            <li>
+                                <span>备注:</span>
+                                <span>{{ item.remark }}</span>
+                            </li>
+                            <li>
+                                <span>实际:</span>
+                                <span>{{ item.inrealqty }}{{ item.goodunit }}</span>
+                            </li>
+                            <li>
+                                <span>审核时间:</span>
+                                <span>{{ formatDate(item.audittime) }}</span>
+                            </li>
+                            <li>
+                                <span>审核备注:</span>
+                                <span>{{ item.auditremark }}</span>
+                            </li>
+                        </ul>
+                    </div>
+                </div>
+            </div>
+        </app-pull-refresh>
+    </app-view>
+</template>
+
+<script lang="ts" setup>
+import { shallowRef } from 'vue'
+import { useRequest } from '@/hooks/request'
+import { queryUserGoodsInventoryLog } from '@/services/api/order'
+import AppPullRefresh from '@mobile/components/base/pull-refresh/index.vue'
+import { formatDate } from '@/filters';
+import { getAppointmentModelOutName, getInoutApplyStatusName, getInoutTypeName } from '@/constants/order';
+
+const error = shallowRef(false)
+const dataList = shallowRef<Model.UserGoodsInventoryLogRsp[]>([])
+
+const { loading, pageIndex, pageCount, run } = useRequest(queryUserGoodsInventoryLog, {
+    onSuccess: (res) => {
+        if (pageIndex.value === 1) {
+            dataList.value = []
+        }
+        dataList.value.push(...res.data)
+    },
+    onError: () => {
+        error.value = true
+    }
+})
+</script>

+ 70 - 0
src/packages/sbyj/views/inventory/index.vue

@@ -0,0 +1,70 @@
+<template>
+    <app-view>
+        <template #header>
+            <app-navbar title="我的库存" />
+        </template>
+        <app-pull-refresh ref="pullRefreshRef" v-model:loading="loading" v-model:error="error"
+            v-model:pageIndex="pageIndex" :page-count="pageCount" @refresh="run">
+            <div class="g-order-list">
+                <div class="g-order-list__box" v-for="(item, index) in dataList" :key="index">
+                    <div class="g-order-list__content">
+                        <ul>
+                            <li>
+                                <span>{{ item.goodscode }}/{{ item.goodsname }}</span>
+                            </li>
+                            <li>
+                                <span>{{ item.curqty }}{{ item.goodunit }}</span>
+                            </li>
+                        </ul>
+                    </div>
+                    <div class="g-order-list__btnbar">
+                        <Button size="small" @click="showComponent('inOut', item, 1)" round>入库申请</Button>
+                        <Button size="small" @click="showComponent('inOut', item, 2)" round>出库申请</Button>
+                        <Button size="small" @click="showComponent('logs', item, 1)" round>申请记录</Button>
+                    </div>
+                </div>
+            </div>
+        </app-pull-refresh>
+        <component ref="componentRef" v-bind="{ selectedRow, inOutType }" :is="componentMap.get(componentId)"
+            @closed="closeComponent" v-if="componentId" />
+    </app-view>
+</template>
+
+<script lang="ts" setup>
+import { shallowRef, defineAsyncComponent } from 'vue'
+import { Button } from 'vant'
+import { useRequest } from '@/hooks/request'
+import { queryUserGoodsInventory } from '@/services/api/order'
+import { useComponent } from '@/hooks/component'
+import AppPullRefresh from '@mobile/components/base/pull-refresh/index.vue'
+
+const componentMap = new Map<string, unknown>([
+    ['logs', defineAsyncComponent(() => import('./components/logs/index.vue'))], // 申请记录
+    ['inOut', defineAsyncComponent(() => import('./components/inOut/index.vue'))], // 申请记录
+])
+
+const error = shallowRef(false)
+const dataList = shallowRef<Model.UserGoodsInventoryRsp[]>([])
+const selectedRow = shallowRef<Model.UserGoodsInventoryRsp>()
+const inOutType = shallowRef(1) 
+
+const { componentRef, componentId, openComponent, closeComponent } = useComponent()
+
+const { loading, pageIndex, pageCount, run } = useRequest(queryUserGoodsInventory, {
+    onSuccess: (res) => {
+        if (pageIndex.value === 1) {
+            dataList.value = []
+        }
+        dataList.value.push(...res.data)
+    },
+    onError: () => {
+        error.value = true
+    }
+})
+
+const showComponent = (componentName: string, row: Model.UserGoodsInventoryRsp, type: number) => {
+    inOutType.value = type
+    selectedRow.value = row
+    openComponent(componentName)
+}
+</script>

+ 1 - 1
src/packages/sbyj/views/market/detail/index.vue

@@ -297,7 +297,7 @@ const onSubmit = () => {
     const qty = `订单数量:${orderQty.value}${getGoodsUnitName(goodunitid)}\n`
     const orderamount = `订单总额:${formatDecimal(totalamount)}\n`
     console.log(marginalgorithm, transferdepositratio)
-    const margin = `预付定金:${marginalgorithm === 1 ? totalamount*transferdepositratio : orderQty.value*transferdepositratio}\n`
+    const margin = `预付定金:${formatDecimal(marginalgorithm === 1 ? totalamount*transferdepositratio : orderQty.value*transferdepositratio)}\n`
     const message = orderPrice + qty + orderamount + margin
 
     dialog({

+ 3 - 0
src/packages/sbyj/views/mine/index.vue

@@ -77,6 +77,9 @@
                 <li @click="routerTo('pickup-list')">
                     <Iconfont label-direction="bottom" icon="g-icon-pickup--line">提料订单</Iconfont>
                 </li>
+                <li @click="routerTo('inventory-list')">
+                    <Iconfont label-direction="bottom" icon="g-icon-fwrx">我的库存</Iconfont>
+                </li>
             </ul>
         </app-block>
         <app-block class="g-navmenu">

+ 26 - 0
src/services/api/order/index.ts

@@ -302,4 +302,30 @@ export function queryUserTradeSettings(config: RequestConfig<Model.UserTradeSett
             ...config.data
         },
     })
+}
+
+/**
+ * 用户库存查询(订单系统)
+ */
+export function queryUserGoodsInventory(config: RequestConfig<Model.UserGoodsInventoryReq> = {}) {
+    return http.commonRequest<Model.UserGoodsInventoryRsp[]>({
+        url: '/sbyj/QueryUserGoodsInventory',
+        params: {
+            userId: getUserId(),
+            ...config.data
+        },
+    })
+}
+
+/**
+ *用户出入库流水(订单系统)
+ */
+export function queryUserGoodsInventoryLog(config: RequestConfig<Model.UserGoodsInventoryLogReq> = {}) {
+    return http.commonRequest<Model.UserGoodsInventoryLogRsp[]>({
+        url: '/sbyj/QueryUserGoodsInventoryLog',
+        params: {
+            userId: getUserId(),
+            ...config.data
+        },
+    })
 }

+ 15 - 0
src/services/api/trade/index.ts

@@ -413,4 +413,19 @@ export function deposiTransferOperate(config: RequestConfig<Partial<Proto.Deposi
         requestCode: 'DepositTransferOperateReq',
         responseCode: 'DepositTransferOperateRsp'
     })
+}
+
+/**
+ * 用户出入库审核
+ */
+export function goodsInventoryApply(config: RequestConfig<Partial<Proto.GoodsInventoryApplyReq>>) {
+    return http.mqRequest<Proto.GoodsInventoryApplyRsp>({
+        data: {
+            ClientSerialNo: v4(),
+            UserID: loginStore.userId,
+            ...config.data
+        },
+        requestCode: 'GoodsInventoryApplyReq',
+        responseCode: 'GoodsInventoryApplyRsp',
+    })
 }

+ 1 - 1
src/stores/modules/enum.ts

@@ -14,7 +14,7 @@ export interface EnumType {
     bankmappedvalue?: string
 }
 
-const enumKeys = ['confirmStatus', 'countrycode', 'executetype', 'currency', 'deliveryOrderStatus', 'operatetypesearch', 'deliveryPayMode', 'applystatus', 'deliveryStatus', 'operateType', 'WRPresaleStatus', 'clientType', 'stepStatus', 'scoreConfigType', 'GZBSCPayStatus', 'gt_kksjdw', 'performanceStatus', 'handlestatus', 'performanceType', 'accountBusinessCode', 'certificatetype', 'signstatus', 'thjOrderStatus', 'THJDeliveryMode', 'goodsunit', 'WROutInApplyStatus2', 'THJTransferStatus', 'WRTradeOrderStatus', 'THJMarket', 'THJProfitRoleType', 'appointmentModelOut', 'orderstatus', 'Pricemode2', 'buildtype', 'listingselecttype', 'certypeperson', 'runstatus', 'traderstatus', 'transferapplystatus', 'ePayFlag', 'goodscurrency', 'paymodel'] as const
+const enumKeys = ['confirmStatus', 'countrycode', 'inoutapplystatus', 'inouttype', 'executetype', 'currency', 'deliveryOrderStatus', 'operatetypesearch', 'deliveryPayMode', 'applystatus', 'deliveryStatus', 'operateType', 'WRPresaleStatus', 'clientType', 'stepStatus', 'scoreConfigType', 'GZBSCPayStatus', 'gt_kksjdw', 'performanceStatus', 'handlestatus', 'performanceType', 'accountBusinessCode', 'certificatetype', 'signstatus', 'thjOrderStatus', 'THJDeliveryMode', 'goodsunit', 'WROutInApplyStatus2', 'THJTransferStatus', 'WRTradeOrderStatus', 'THJMarket', 'THJProfitRoleType', 'appointmentModelOut', 'orderstatus', 'Pricemode2', 'buildtype', 'listingselecttype', 'certypeperson', 'runstatus', 'traderstatus', 'transferapplystatus', 'ePayFlag', 'goodscurrency', 'paymodel'] as const
 
 const enumMap = new Map<typeof enumKeys[number], ShallowRef<Model.EnumRsp[]>>()
 

+ 72 - 0
src/types/model/order.d.ts

@@ -1897,4 +1897,76 @@ declare namespace Model {
         goodstradetype: string // 商品交易权限类型(3) - 1:可建可平 2:可建不可平 3:不可建可平 4:不可建不可平
         userid: number     // 用户ID
     }
+ 
+    /** 用户库存查询 请求 */
+    interface UserGoodsInventoryReq {
+        userId: number // 用户ID
+    }
+
+    /** 用户库存查询 响应 */
+    interface UserGoodsInventoryRsp {
+        // 期末库存量
+        curqty: number   
+        // 商品ID
+        goodsid: number  
+        // 商品代码
+        goodscode: string
+        // 商品名称
+        goodsname: string 
+        // 更新时间
+        updatetime: string 
+        // 报价单位
+        goodunit: string 
+        // 报价单位ID
+        goodunitid: string 
+         // 用户ID
+        userid: number    
+    }
+
+    /** 用户出入库流水 请求 */
+    interface UserGoodsInventoryLogReq {
+        userId: number // 用户ID
+    }
+
+    /** 用户出入库流水 响应 */
+    interface UserGoodsInventoryLogRsp {
+        // 申请ID(SEQ_USERGOODSINVENTORYLOG)
+        applyid: number
+        // 申请状态(enum:inoutapplystatus) - 1:待审核 2:审核通过 3:审核拒绝 4:处理失败
+        applystatus: number
+        // 申请时间
+        applytime: string
+        // 审核人
+        auditid: number
+        // 审核备注
+        auditremark: string
+        // 审核时间
+        audittime: string
+        // 客户端流水号
+        clientticket: string
+        // 商品ID
+        goodsid: number
+        // 商品代码
+        goodscode: string
+        // 商品名称
+        goodsname: string 
+        // 报价单位
+        goodunit: string 
+        // 报价单位ID
+        goodunitid: string 
+        // 出入库方式 - 1:邮寄 3:自提 4:配送(enum:appointmentModelOut)
+        inoutmodel: number
+        // 申请类型 - 1:入库 2:出库 (enum:inouttype)
+        inouttype: number
+        // 实际数量
+        inrealqty: number
+        // 数量
+        qty: number
+        // 备注
+        remark: string
+        // 交易日(yyyyMMdd)
+        tradedate: string
+        // 申请人ID
+        userid: number
+    }
 }

+ 20 - 1
src/types/proto/trade.d.ts

@@ -1,4 +1,3 @@
-import { number } from 'echarts';
 import { IMessageHead } from './proto'
 import Long from 'long'
 
@@ -827,5 +826,25 @@ declare global {
             RetDesc: string; // 描述信息
             ClientSerialNo: string; // 客户端流水号
         }
+        // 用户出入库申请请求
+        interface GoodsInventoryApplyReq {
+            Header: IMessageHead; // 消息头
+            UserID?: number; // 用户Id
+            GoodsID?: number; // 商品Id
+            InoutType?: number; // 出入库类型1:入库,2:出库
+            Qty?: number; // 出入库数量
+            Remark?: string; // 申请备注
+            InOutModel?: number; // 出入库方式1:邮寄,3:自提,4:配送
+            ClientSerialNo?: string; // 流水号
+        }
+        // 用户出入库申请应答
+        interface GoodsInventoryApplyRsp {
+            Header: IMessageHead; // 消息头
+            RetCode: number; // 返回码
+            RetDesc: string; // 描述信息
+            ClientSerialNo: string; // 客户端流水号
+            ApplyID: number; // 申请单Id
+            ApplyStatus: number; // 申请状态1:待审核
+        }
     }
 }