li.shaoyi 3 lat temu
rodzic
commit
6325872d26
38 zmienionych plików z 661 dodań i 99 usunięć
  1. 21 0
      public/proto/gz.proto
  2. 24 4
      src/business/goods/index.ts
  3. 2 2
      src/business/menu/index.ts
  4. 78 3
      src/business/order/desting.ts
  5. 1 1
      src/business/table/index.ts
  6. 103 6
      src/business/user/index.ts
  7. 2 2
      src/business/warehouse/index.ts
  8. 5 4
      src/components/base/tabs/index.less
  9. 20 0
      src/constants/certificate.ts
  10. 3 0
      src/constants/funcode.ts
  11. 11 9
      src/mock/router.ts
  12. 4 4
      src/packages/pc/assets/themes/default/default.less
  13. 1 1
      src/packages/pc/components/base/drawer/index.less
  14. 1 1
      src/packages/pc/components/base/table-filter/index.less
  15. 8 1
      src/packages/pc/components/layouts/main/index.less
  16. 1 1
      src/packages/pc/components/layouts/main/index.vue
  17. 2 2
      src/packages/pc/components/modules/goods-details/buy.vue
  18. 20 13
      src/packages/pc/views/listing/buy/components/delisting/index.vue
  19. 32 20
      src/packages/pc/views/listing/buy/components/details/index.vue
  20. 42 0
      src/packages/pc/views/mine/address/components/default/index.vue
  21. 42 0
      src/packages/pc/views/mine/address/components/delete/index.vue
  22. 4 3
      src/packages/pc/views/mine/address/components/edit/index.vue
  23. 14 0
      src/packages/pc/views/mine/address/index.vue
  24. 42 0
      src/packages/pc/views/mine/invoice/components/delete/index.vue
  25. 86 0
      src/packages/pc/views/mine/invoice/components/edit/index.vue
  26. 2 2
      src/packages/pc/views/system/menu/components/edit/index.vue
  27. 2 2
      src/packages/pc/views/warehousing/goods/components/edit/diamond.vue
  28. 2 2
      src/packages/pc/views/warehousing/goods/components/edit/fancy.vue
  29. 2 2
      src/packages/pc/views/warehousing/goods/components/edit/jewelry.vue
  30. 2 2
      src/packages/pc/views/warehousing/goods/components/edit/rough.vue
  31. 41 0
      src/packages/pc/views/warehousing/goods/components/favorite/index.vue
  32. 2 2
      src/packages/pc/views/warehousing/goods/index.vue
  33. 2 2
      src/packages/pc/views/warehousing/warehouse/components/edit/index.vue
  34. 1 0
      src/packages/pc/views/warehousing/warehouse/index.vue
  35. 7 0
      src/services/api/goods/index.ts
  36. 21 0
      src/types/proto/goods.d.ts
  37. 2 2
      src/types/proto/order.d.ts
  38. 6 6
      src/types/proto/user.d.ts

+ 21 - 0
public/proto/gz.proto

@@ -365,6 +365,27 @@ message AddZSGoodsRsp {
 		optional string ClientSerialNo = 10; // 客户端流水号
 }
 
+// 商品收藏操作接口请求
+message GoodsFavoriteOperateReq {
+	optional MessageHead Header = 1;
+		optional uint32 UserID = 2; // 用户ID,必填
+		optional uint64 WRTradeOrderID = 3; // 委托单ID,必填
+		optional uint32 OperateType = 4; // 操作类型,1:添加2:删除,必填
+		optional uint32 ClientType = 5; // 终端类型
+		optional uint32 MarketID = 6; // 市场ID,必填
+		optional string ClientSerialNo = 7; // 客户端流水号
+}
+
+// 商品收藏操作接口应答
+message GoodsFavoriteOperateRsp {
+	optional MessageHead Header = 1; // 消息头
+	optional int32 RetCode = 2; // 返回码
+	optional string RetDesc = 3; // 描述信息
+		optional uint32 UserID = 4; // 用户ID
+		optional uint64 WRTradeOrderID = 5; // 委托单ID
+		optional string ClientSerialNo = 6; // 客户端流水号
+}
+
 // 钻石买挂牌属性
 message GZBuyOrderDetailExInfo {
     optional uint64 UserID = 1; // 用户ID

+ 24 - 4
src/business/goods/index.ts

@@ -6,7 +6,7 @@ import { formatDecimal } from '@/filters'
 import { ClientType } from '@/constants/client'
 import { Market } from '@/constants/market'
 import { queryWarehouseInfo } from '@/services/api/warehouse'
-import { addZSGoods, queryDiamondList, queryDiamondDetails } from '@/services/api/goods'
+import { addZSGoods, queryDiamondList, queryDiamondDetails, goodsFavoriteOperate } from '@/services/api/goods'
 import { sessionData } from '@/stores'
 import {
     Category,
@@ -125,6 +125,7 @@ export function useDiamond() {
 
 // 钻石详情相关
 export function useDiamondDetails(goodsno: string) {
+    const { UserID } = sessionData.getValue('loginInfo')
     const loading = shallowRef(false)
     const details = shallowRef<Ermcp.DiamondDetailsRsp>()
 
@@ -143,10 +144,29 @@ export function useDiamondDetails(goodsno: string) {
         })
     }
 
+    // 钻石收藏
+    const diamondFavorite = () => {
+        loading.value = true
+        return goodsFavoriteOperate({
+            data: {
+                UserID, // 用户ID,必填
+                WRTradeOrderID: 0, // 委托单ID,必填
+                OperateType: 1, // 操作类型,1:添加2:删除,必填
+                ClientType: ClientType.Web, // 终端类型
+                MarketID: Market.GZ, // 市场ID,必填
+                ClientSerialNo: v4() // 客户端流水号
+            },
+            complete: () => {
+                loading.value = false
+            }
+        })
+    }
+
     return {
         loading,
         details,
-        getDiamondDetails
+        getDiamondDetails,
+        diamondFavorite
     }
 }
 
@@ -241,7 +261,7 @@ export function useDiamondForm(category: Category) {
     // 货币信息
     const currencyInfo = computed(() => getCurrencyTypeInfo(formData.ZSCurrencyType ?? 0))
 
-    const formSubmit = () => {
+    const addOrUpdate = () => {
         loading.value = true
         return addZSGoods({
             data: {
@@ -283,6 +303,6 @@ export function useDiamondForm(category: Category) {
         selectedType,
         warehouseList,
         currencyInfo,
-        formSubmit,
+        addOrUpdate,
     }
 }

+ 2 - 2
src/business/menu/index.ts

@@ -65,7 +65,7 @@ export function useMenuForm(selectedRow?: Ermcp.NewFuncmenuRsp) {
         ]
     })
 
-    const formSubmit = () => {
+    const addOrUpdate = () => {
         loading.value = true
         return insertNewFuncmenu({
             data: formData,
@@ -81,6 +81,6 @@ export function useMenuForm(selectedRow?: Ermcp.NewFuncmenuRsp) {
         loading,
         menus,
         formData,
-        formSubmit,
+        addOrUpdate,
     }
 }

+ 78 - 3
src/business/order/desting.ts

@@ -1,14 +1,16 @@
-import { shallowRef } from 'vue'
+import { shallowRef, reactive } from 'vue'
 import { v4 } from 'uuid'
 import { ClientType } from '@/constants/client'
 import { Market } from '@/constants/market'
-import { zsBuyOrderDesting } from '@/services/api/order'
+import { useDataTable } from '@/hooks/datatable'
+import { queryDiamondList } from '@/services/api/goods'
+import { zsBuyOrderDesting, zsSellOrderDestingApply } from '@/services/api/order'
 import { sessionData } from '@/stores'
 import moment from 'moment'
 import Long from 'long'
 
 /**
- * 钻石买摘牌
+ * 钻石买摘牌(商品购买)
  * @returns 
  */
 export function useBuyOrderDesting(selectedRow: Ermcp.SellOrderRsp) {
@@ -43,4 +45,77 @@ export function useBuyOrderDesting(selectedRow: Ermcp.SellOrderRsp) {
         loading,
         formSubmit
     }
+}
+
+/**
+ * 钻石卖摘牌
+ * @returns 
+ */
+export function useSellOrderDesting(selectedRow: Ermcp.BuyOrderRsp) {
+    const { UserID, AccountIDs } = sessionData.getValue('loginInfo')
+    const { dataList } = useDataTable<Ermcp.MyWRPositionRsp>()
+    const loading = shallowRef(false)
+
+    const formData = reactive<Proto.ZSSellOrderDestingApplyReq>({
+        Header: {
+            AccountID: AccountIDs[0],
+        },
+        UserID, // 用户ID,必填
+        AccountID: AccountIDs[0], // 资金账户ID,必填
+        BuyWRTradeOrderID: Long.fromString(selectedRow.wrtradeorderid), // 买挂牌委托单ID,必填
+        WRStandardID: 0, // 现货商品ID,必填
+        ApplyQty: 0, // 申请数量,必填,2位小数
+        ApplyPrice: 0, // 申请价格,必填,2位小数
+        LadingBillID: Long.fromNumber(0), // 提单ID,必填
+        SubNum: 0, // 提单子单号,必填
+        ApplyRemark: '', // 备注
+        ClientType: ClientType.Web, // 终端类型
+        ClientSerialNo: '', // 客户端流水号
+        MarketID: Market.GZ // 市场ID,必填
+    })
+
+    const columns = shallowRef<Ermcp.TableColumn[]>([
+        { prop: 'goodsno', label: '商品编号', show: true, },
+        { prop: 'price', label: '总价', show: true, },
+        { prop: 'weight', label: '总重量', show: true, },
+        { prop: 'weightavg', label: '平均单颗重量', show: true, },
+        { prop: 'priceper', label: '克拉单位', show: true, },
+        { prop: 'ftotalqty', label: '库存重量', show: true, },
+        { prop: 'remainqty', label: '剩余重量', show: true, },
+        { prop: 'zsshapetypedisplay', label: '形状', show: true, width: 200, },
+        { prop: 'zscolortype', label: '颜色', show: true, },
+        { prop: 'zsclaritytype', label: '净度', show: true, }
+    ])
+
+    const formSubmit = () => {
+        loading.value = true
+        return zsSellOrderDestingApply({
+            data: {
+                ...formData,
+                ClientSerialNo: v4()
+            },
+            complete: () => {
+                loading.value = false
+            }
+        })
+    }
+
+    // 获取商品列表
+    queryDiamondList({
+        data: {
+            wruserid: UserID,
+            zscategory: selectedRow.zscategory,
+        },
+        success: (res) => {
+            dataList.value = res.data.filter((e) => e.ftotalqty - e.ffreezeqty > 0)
+        },
+    })
+
+    return {
+        loading,
+        dataList,
+        columns,
+        formData,
+        formSubmit
+    }
 }

+ 1 - 1
src/business/table/index.ts

@@ -173,7 +173,7 @@ const pcTableColumnMap = new Map<TableColumnKey, Ermcp.TableColumn[]>([
         { prop: 'cardtypeid', label: '证件类型' },
         { prop: 'cardnum', label: '证件号码' },
         { prop: 'phonenum', label: '联系电话' },
-        { prop: 'address', label: '收货地址' },
+        { prop: 'address', label: '收货地址', width: 300 },
         { prop: 'isdefault', label: '是否默认' },
         { prop: 'operate', label: '操作', width: 250 }
     ]],

+ 103 - 6
src/business/user/index.ts

@@ -1,8 +1,9 @@
 import { shallowRef, reactive } from 'vue'
 import { useDataTable } from '@/hooks/datatable'
 import { getTableColumns } from '@/business/table'
-import { queryUserReceiveInfo, queryWrUserReceiptInfo, userReceiveInfo } from '@/services/api/user'
+import { queryUserReceiveInfo, queryWrUserReceiptInfo, userReceiveInfo, delUserReceiveInfo, userReceiveIsDefault, userReceiptInfo, delUserReceiptInfo } from '@/services/api/user'
 import { sessionData } from '@/stores'
+import { getCertificateTypeList } from '@/constants/certificate'
 
 export function useAddress() {
     const { dataList, total, pageIndex, pageSize } = useDataTable<Ermcp.UserReceiveInfoRsp>()
@@ -37,24 +38,29 @@ export function useAddress() {
 }
 
 export function useAddressForm(selectedRow?: Ermcp.UserReceiveInfoRsp) {
+    const { UserID } = sessionData.getValue('loginInfo')
     const loading = shallowRef(false)
+    const certificateTypeList = getCertificateTypeList()
+
     const formData = reactive<Proto.UserReceiveInfoReq>({
-        ClientSerialID: 0,
-        UserID: sessionData.getLoginInfo('UserID'),
+        ReceiveInfoId: 0,
+        UserID,
+        CardTypeID: 0,
         ReceiverName: '',
         CardNum: '',
         PhoneNum: '',
-        CountryID: 0,
         Address: '',
         TakeRemark: '',
     })
 
     if (selectedRow?.autoid) {
         ({
+            autoid: formData.ReceiveInfoId,
             userid: formData.UserID,
             receivername: formData.ReceiverName,
             cardtypeid: formData.CardTypeID,
             cardnum: formData.CardNum,
+            phonenum: formData.PhoneNum,
             countryid: formData.CountryID,
             provinceid: formData.ProvinceID,
             cityid: formData.CityID,
@@ -64,7 +70,7 @@ export function useAddressForm(selectedRow?: Ermcp.UserReceiveInfoRsp) {
         } = selectedRow)
     }
 
-    const formSubmit = () => {
+    const addOrUpdate = () => {
         loading.value = true
         return userReceiveInfo({
             data: formData,
@@ -74,10 +80,38 @@ export function useAddressForm(selectedRow?: Ermcp.UserReceiveInfoRsp) {
         })
     }
 
+    const deleteAddress = () => {
+        loading.value = true
+        return delUserReceiveInfo({
+            data: {
+                ReceiveInfoId: formData.ReceiveInfoId
+            },
+            complete: () => {
+                loading.value = false
+            }
+        })
+    }
+
+    const updateAddressIsDefault = () => {
+        loading.value = true
+        return userReceiveIsDefault({
+            data: {
+                UserId: UserID,
+                AutoId: formData.ReceiveInfoId
+            },
+            complete: () => {
+                loading.value = false
+            }
+        })
+    }
+
     return {
         loading,
+        certificateTypeList,
         formData,
-        formSubmit,
+        addOrUpdate,
+        deleteAddress,
+        updateAddressIsDefault,
     }
 }
 
@@ -111,4 +145,67 @@ export function useInvoice() {
         pageSize,
         getUserInvoiceList,
     }
+}
+
+export function useInvoiceForm(selectedRow?: Ermcp.WrUserReceiptInfoRsp) {
+    const { UserID } = sessionData.getValue('loginInfo')
+    const loading = shallowRef(false)
+    const certificateTypeList = getCertificateTypeList()
+
+    const formData = reactive<Proto.UserReceiptInfoReq>({
+        UserID, // 用户ID
+        UserName: '', // 发票抬头姓名
+        ReceiptType: 1, // 发票类型
+        TaxpayerID: '', // 纳税人识别号
+        ContactInfo: '', // 联系方式
+        ReceiptInfoId: 0, // 修改时填用户发票信息id
+        ReceiptBank: '', // 发票开户行[发票类型:企业]
+        ReceiptAccount: '', // 发票帐号[发票类型:企业]
+        Address: '', // 地址[发票类型:企业]
+    })
+
+    if (selectedRow?.autoid) {
+        ({
+            autoid: formData.ReceiptInfoId,
+            userid: formData.UserID,
+            username: formData.UserName,
+            receipttype: formData.ReceiptType,
+            taxpayerid: formData.TaxpayerID,
+            contactinfo: formData.ContactInfo,
+            receiptbank: formData.ReceiptBank,
+            receiptaccount: formData.ReceiptAccount,
+            address: formData.Address,
+            idnum: formData.IDNum,
+        } = selectedRow)
+    }
+
+    const addOrUpdate = () => {
+        loading.value = true
+        return userReceiptInfo({
+            data: formData,
+            complete: () => {
+                loading.value = false
+            }
+        })
+    }
+
+    const deleteInvoice = () => {
+        loading.value = true
+        return delUserReceiptInfo({
+            data: {
+                ReceiptInfoId: formData.ReceiptInfoId
+            },
+            complete: () => {
+                loading.value = false
+            }
+        })
+    }
+
+    return {
+        loading,
+        certificateTypeList,
+        formData,
+        addOrUpdate,
+        deleteInvoice,
+    }
 }

+ 2 - 2
src/business/warehouse/index.ts

@@ -65,7 +65,7 @@ export function useWarehouseForm(selectedRow?: Ermcp.WarehouseInfoRsp) {
         } = selectedRow)
     }
 
-    const formSubmit = () => {
+    const addOrUpdate = () => {
         loading.value = true
         return warehouseApply({
             data: formData,
@@ -79,6 +79,6 @@ export function useWarehouseForm(selectedRow?: Ermcp.WarehouseInfoRsp) {
         loading,
         accountName,
         formData,
-        formSubmit,
+        addOrUpdate,
     }
 }

+ 5 - 4
src/components/base/tabs/index.less

@@ -1,7 +1,6 @@
 .app-tabs {
     display       : flex;
     flex-direction: column;
-    overflow      : hidden;
 
     &--top,
     &--bottom {
@@ -37,8 +36,10 @@
     }
 
     &__container {
-        position  : relative;
-        flex      : 1;
-        overflow-y: auto;
+        position      : relative;
+        flex          : 1;
+        overflow-y    : auto;
+        display       : flex;
+        flex-direction: column;
     }
 }

+ 20 - 0
src/constants/certificate.ts

@@ -0,0 +1,20 @@
+import { getEnumTypes, getEnumTypeList, getEnumTypeName } from './index'
+
+const enumKeys = ['certificatetype'] as const
+const enumMap = getEnumTypes(...enumKeys)
+
+/**
+ * 获取证件类型列表
+ * @returns 
+ */
+export function getCertificateTypeList() {
+    return getEnumTypeList(enumMap.get('certificatetype'))
+}
+
+/**
+ * 获取证件类型名称
+ * @returns 
+ */
+export function getCertificateTypeName(value: number) {
+    return getEnumTypeName(getCertificateTypeList(), value)
+}

+ 3 - 0
src/constants/funcode.ts

@@ -42,6 +42,9 @@ export enum FunCode {
     ZSBuyOrderDestingNegPriceOperateReq = 1441835, // 买摘牌询价操作接口请求
     ZSBuyOrderDestingNegPriceOperateRsp = 1441836, // 买摘牌询价操作接口应答
 
+    GoodsFavoriteOperateReq = 1441843, // 商品收藏操作接口请求
+    GoodsFavoriteOperateRsp = 1441844, // 商品收藏操作接口应答
+
     UserReceiveInfoReq = 1900545, // 新增修改收货地址请求
     UserReceiveInfoRsp = 1900546, // 新增修改收货地址请求响应
     DelUserReceiveInfoReq = 1900547, // 删除收货地址请求

+ 11 - 9
src/mock/router.ts

@@ -85,7 +85,7 @@ const appmenu = {
                                 authType: 3,
                                 title: '收藏',
                                 code: 'listing_sell_favorite',
-                                component: 'views/listing/sell/components/favorite/index.vue',
+                                component: 'views/warehousing/goods/components/favorite/index.vue',
                                 buttonName: 'favorite',
                                 buttonType: 'primary',
                             },
@@ -115,14 +115,16 @@ const appmenu = {
                                 component: 'views/listing/buy/components/details/index.vue',
                                 buttonName: 'details',
                                 buttonType: 'primary',
-                            },
-                            {
-                                authType: 3,
-                                title: '摘牌',
-                                code: 'listing_buy_delisting',
-                                component: 'views/listing/buy/components/delisting/index.vue',
-                                buttonName: 'delisting',
-                                buttonType: 'primary',
+                                children: [
+                                    {
+                                        authType: 2,
+                                        title: '摘牌',
+                                        code: 'listing_buy_delisting',
+                                        component: 'views/listing/buy/components/delisting/index.vue',
+                                        buttonName: 'delisting',
+                                        buttonType: 'primary',
+                                    },
+                                ]
                             },
                         ]
                     },

+ 4 - 4
src/packages/pc/assets/themes/default/default.less

@@ -36,6 +36,10 @@
                 width  : 100%;
                 gap    : 10px;
             }
+
+            &:last-child {
+                margin-bottom: 18px;
+            }
         }
 
         &--horizontal {
@@ -45,10 +49,6 @@
             .el-form-item {
                 width: 50%;
 
-                &:last-child {
-                    margin-bottom: 18px;
-                }
-
                 &__label {
                     padding: 0 12px;
                 }

+ 1 - 1
src/packages/pc/components/base/drawer/index.less

@@ -15,7 +15,7 @@
         justify-content: space-between;
         align-items    : center;
         border-bottom  : 1px solid #f2f2f2;
-        padding        : 18px 24px;
+        padding        : 16px 24px;
 
         h1 {
             font-size: 16px;

+ 1 - 1
src/packages/pc/components/base/table-filter/index.less

@@ -4,7 +4,7 @@
     gap      : 12px;
 
     .el-form-item {
-        margin: 0;
+        margin: 0 !important;
     }
 
     .el-select {

+ 8 - 1
src/packages/pc/components/layouts/main/index.less

@@ -1,11 +1,18 @@
 .app-main {
+    flex      : 1;
+    overflow-y: auto;
+
+    &__scrollbar {
+        height: auto;
+    }
+
     &__container {
         height: 100%;
     }
 
     &__teleport {
         position  : absolute;
-        z-index   : 10;
+        z-index   : 9;
         left      : 0;
         top       : 0;
         width     : 100%;

+ 1 - 1
src/packages/pc/components/layouts/main/index.vue

@@ -1,7 +1,7 @@
 <template>
     <app-tabs class="app-main" :data-list="secondMenus" v-model:data-index="dataIndex" @change="onTabChange">
         <div id="appMainTeleport" class="app-main__teleport"></div>
-        <el-scrollbar view-class="app-main__container" always>
+        <el-scrollbar class="app-main__scrollbar" view-class="app-main__container" always>
             <!-- 二级路由 -->
             <router-view v-slot="{ Component, route }">
                 <component :is="Component" :key="route.fullPath" />

+ 2 - 2
src/packages/pc/components/modules/goods-details/buy.vue

@@ -1,7 +1,7 @@
 <!-- 商品详情-立即购买 -->
 <template>
-    <app-drawer title="购买" v-model:show="show" :loading="loading">
-        <div style="font-size:16px;text-align:center">是否购买商品?</div>
+    <app-drawer title="提示" v-model:show="show" :loading="loading">
+        <div style="font-size:16px;text-align:center">是否购买商品?</div>
         <template #footer>
             <el-button @click="onCancel" plain>取消</el-button>
             <el-button type="primary" @click="onSubmit">确认</el-button>

+ 20 - 13
src/packages/pc/views/listing/buy/components/delisting/index.vue

@@ -1,27 +1,34 @@
 <template>
-    <teleport to="#appMainTeleport">
-        <app-view v-bind="$attrs">
-            <template #header>
-                <el-button @click="onClick">返回</el-button>
-            </template>
-            摘牌
-        </app-view>
-    </teleport>
+    <div>摘牌</div>
+    <app-table :data="dataList" :columns="columns" :show-header="false" selection-type="single" border
+        @select="onTableSelect" />
 </template>
 
 <script lang="ts" setup>
 import { PropType } from 'vue'
+import Long from 'long'
+import { useSellOrderDesting } from '@/business/order/desting'
+import AppTable from '@pc/components/base/table/index.vue'
 
-defineProps({
+const props = defineProps({
     selectedRow: {
-        type: Object as PropType<Ermcp.GoodsRsp>,
+        type: Object as PropType<Ermcp.BuyOrderRsp>,
         default: () => ({})
     }
 })
 
-const emit = defineEmits(['closed'])
+const { loading, dataList, columns, formData } = useSellOrderDesting(props.selectedRow)
 
-const onClick = () => {
-    emit('closed')
+// 勾选表格行
+const onTableSelect = (rows: Ermcp.MyWRPositionRsp[]) => {
+    const row = rows[0]
+    if (row) {
+        formData.WRStandardID = row.wrstandardid
+        formData.LadingBillID = Long.fromString(row.ladingbillid)
+        formData.ApplyQty = row.ftotalqty - row.ffreezeqty
+        formData.SubNum = row.subnum
+    } else {
+        formData.WRStandardID = 0
+    }
 }
 </script>

+ 32 - 20
src/packages/pc/views/listing/buy/components/details/index.vue

@@ -1,31 +1,43 @@
+<!-- 挂牌大厅-求购大厅-详情 -->
 <template>
-    <app-drawer class="listing-buy-details" title="求购详情" width="680" v-model:show="show">
-        <el-descriptions :column="2" style="padding:20px">
-            <el-descriptions-item label="委托单号"></el-descriptions-item>
-            <el-descriptions-item label="买方"></el-descriptions-item>
-            <el-descriptions-item label="钻石分类"></el-descriptions-item>
-            <el-descriptions-item label="货币类型"></el-descriptions-item>
-            <el-descriptions-item label="尺寸"></el-descriptions-item>
-            <el-descriptions-item label="形状"></el-descriptions-item>
-            <el-descriptions-item label="净度"></el-descriptions-item>
-            <el-descriptions-item label="对称度"></el-descriptions-item>
-            <el-descriptions-item label="颜色"></el-descriptions-item>
-            <el-descriptions-item label="切工"></el-descriptions-item>
-            <el-descriptions-item label="荧光"></el-descriptions-item>
-        </el-descriptions>
-    </app-drawer>
+    <teleport to="#appMainTeleport">
+        <app-view class="app-details" v-bind="$attrs">
+            <template #header>
+                <div>
+                    <el-button @click="$emit('closed')">返回</el-button>
+                </div>
+            </template>
+            <el-descriptions title="求购信息" :column="2">
+                <el-descriptions-item label="委托单号">{{ selectedRow.wrtradeorderid }}</el-descriptions-item>
+                <el-descriptions-item label="买方">{{ selectedRow.buyusername }}</el-descriptions-item>
+                <el-descriptions-item label="钻石分类">{{ selectedRow.zscategorydisplay }}</el-descriptions-item>
+                <el-descriptions-item label="货币类型">{{ selectedRow.zscurrencytypedisplay }}</el-descriptions-item>
+                <el-descriptions-item label="尺寸">{{ selectedRow.zssize }}</el-descriptions-item>
+                <el-descriptions-item label="形状">{{ selectedRow.zsshapetypedisplay }}</el-descriptions-item>
+                <el-descriptions-item label="净度">{{ selectedRow.zsclaritytypedisplay }}</el-descriptions-item>
+                <el-descriptions-item label="对称度">{{ selectedRow.zssymmetrytypedisplay }}</el-descriptions-item>
+                <el-descriptions-item label="颜色">{{ selectedRow.zscolortypedisplay }}</el-descriptions-item>
+                <el-descriptions-item label="切工">{{ selectedRow.zscuttypedisplay }}</el-descriptions-item>
+                <el-descriptions-item label="荧光">{{ selectedRow.zsfluorescencetypedisplay }}</el-descriptions-item>
+            </el-descriptions>
+            <template v-for="(auth, index) in getAuthComponent()" :key="index">
+                <component :is="componentMap.get(auth.code)" v-bind="{ selectedRow }" />
+            </template>
+        </app-view>
+    </teleport>
 </template>
 
 <script lang="ts" setup>
-import { ref, PropType } from 'vue'
-import AppDrawer from '@pc/components/base/drawer/index.vue'
+import { PropType } from 'vue'
+import { useAuth } from '@/hooks/auth'
 
-defineProps({
+const props = defineProps({
+    code: String,
     selectedRow: {
-        type: Object as PropType<Ermcp.GoodsRsp>,
+        type: Object as PropType<Ermcp.BuyOrderRsp>,
         default: () => ({})
     }
 })
 
-const show = ref(true)
+const { componentMap, getAuthComponent } = useAuth(props.code)
 </script>

+ 42 - 0
src/packages/pc/views/mine/address/components/default/index.vue

@@ -0,0 +1,42 @@
+<!-- 会员中心-我的地址-设为默认 -->
+<template>
+    <app-drawer title="提示" v-model:show="show" :loading="loading" :refresh="refresh">
+        <div style="font-size:16px;text-align:center">该地址是否设为默认?</div>
+        <template #footer>
+            <el-button @click="onCancel(false)" plain>取消</el-button>
+            <el-button type="primary" @click="onSubmit">确认</el-button>
+        </template>
+    </app-drawer>
+</template>
+
+<script lang="ts" setup>
+import { shallowRef, PropType } from 'vue'
+import { ElMessage } from 'element-plus'
+import { useAddressForm } from '@/business/user'
+import AppDrawer from '@pc/components/base/drawer/index.vue'
+
+const props = defineProps({
+    selectedRow: {
+        type: Object as PropType<Ermcp.UserReceiveInfoRsp>,
+        default: () => ({})
+    }
+})
+
+const { loading, updateAddressIsDefault } = useAddressForm(props.selectedRow)
+const show = shallowRef(true)
+const refresh = shallowRef(false)
+
+const onCancel = (isRefresh = false) => {
+    show.value = false
+    refresh.value = isRefresh
+}
+
+const onSubmit = () => {
+    updateAddressIsDefault().then(() => {
+        ElMessage.success('提交成功')
+        onCancel(true)
+    }).catch((err) => {
+        ElMessage.error('提交失败:' + err)
+    })
+}
+</script>

+ 42 - 0
src/packages/pc/views/mine/address/components/delete/index.vue

@@ -0,0 +1,42 @@
+<!-- 会员中心-我的地址-删除 -->
+<template>
+    <app-drawer title="提示" v-model:show="show" :loading="loading" :refresh="refresh">
+        <div style="font-size:16px;text-align:center">是否删除该地址?</div>
+        <template #footer>
+            <el-button @click="onCancel(false)" plain>取消</el-button>
+            <el-button type="primary" @click="onSubmit">确认</el-button>
+        </template>
+    </app-drawer>
+</template>
+
+<script lang="ts" setup>
+import { shallowRef, PropType } from 'vue'
+import { ElMessage } from 'element-plus'
+import { useAddressForm } from '@/business/user'
+import AppDrawer from '@pc/components/base/drawer/index.vue'
+
+const props = defineProps({
+    selectedRow: {
+        type: Object as PropType<Ermcp.UserReceiveInfoRsp>,
+        default: () => ({})
+    }
+})
+
+const { loading, deleteAddress } = useAddressForm(props.selectedRow)
+const show = shallowRef(true)
+const refresh = shallowRef(false)
+
+const onCancel = (isRefresh = false) => {
+    show.value = false
+    refresh.value = isRefresh
+}
+
+const onSubmit = () => {
+    deleteAddress().then(() => {
+        ElMessage.success('提交成功')
+        onCancel(true)
+    }).catch((err) => {
+        ElMessage.error('提交失败:' + err)
+    })
+}
+</script>

+ 4 - 3
src/packages/pc/views/mine/address/components/edit/index.vue

@@ -8,7 +8,8 @@
             </el-form-item>
             <el-form-item label="证件类型" prop="CardTypeID">
                 <el-select v-model="formData.CardTypeID">
-
+                    <el-option :label="item.label" :value="item.value" v-for="(item, index) in certificateTypeList"
+                        :key="index" />
                 </el-select>
             </el-form-item>
             <el-form-item label="联系电话" prop="PhoneNum">
@@ -47,7 +48,7 @@ const props = defineProps({
     }
 })
 
-const { loading, formData, formSubmit } = useAddressForm(props.selectedRow)
+const { loading, formData, certificateTypeList, addOrUpdate } = useAddressForm(props.selectedRow)
 const show = ref(true)
 const refresh = ref(false)
 const formRef = ref<FormInstance>()
@@ -80,7 +81,7 @@ const onCancel = (isRefresh = false) => {
 const onSubmit = () => {
     formRef.value?.validate((valid) => {
         if (valid) {
-            formSubmit().then(() => {
+            addOrUpdate().then(() => {
                 ElMessage.success('提交成功')
                 onCancel(true)
             }).catch((err) => {

+ 14 - 0
src/packages/pc/views/mine/address/index.vue

@@ -5,6 +5,19 @@
             <template #header>
                 <app-auth-operation :menus="['add']" @closed="getUserAddressList" />
             </template>
+            <!-- 证件类型 -->
+            <template #cardtypeid="{ value }">
+                {{ getCertificateTypeName(value) }}
+            </template>
+            <!-- 收货地址 -->
+            <template #address="{ row }">
+                {{ [row.provincename, row.cityname, row.districtname, row.address].join(' ') }}
+            </template>
+            <!-- 是否默认 -->
+            <template #isdefault="{ value }">
+                {{ value ? '是' : '否' }}
+            </template>
+            <!-- 操作 -->
             <template #operate="{ row }">
                 <app-auth-operation :menus="['edit', 'default', 'delete']" :options="{ selectedRow: row }"
                     @closed="getUserAddressList" />
@@ -20,6 +33,7 @@
 <script lang="ts" setup>
 import { ElMessage } from 'element-plus'
 import { useAddress } from '@/business/user'
+import { getCertificateTypeName } from '@/constants/certificate'
 import AppAuthOperation from '@pc/components/modules/auth-operation/index.vue'
 import AppTable from '@pc/components/base/table/index.vue'
 import AppPagination from '@pc/components/base/pagination/index.vue'

+ 42 - 0
src/packages/pc/views/mine/invoice/components/delete/index.vue

@@ -0,0 +1,42 @@
+<!-- 会员中心-我的发票-删除 -->
+<template>
+    <app-drawer title="提示" v-model:show="show" :loading="loading" :refresh="refresh">
+        <div style="font-size:16px;text-align:center">是否删除该发票?</div>
+        <template #footer>
+            <el-button @click="onCancel(false)" plain>取消</el-button>
+            <el-button type="primary" @click="onSubmit">确认</el-button>
+        </template>
+    </app-drawer>
+</template>
+
+<script lang="ts" setup>
+import { shallowRef, PropType } from 'vue'
+import { ElMessage } from 'element-plus'
+import { useInvoiceForm } from '@/business/user'
+import AppDrawer from '@pc/components/base/drawer/index.vue'
+
+const props = defineProps({
+    selectedRow: {
+        type: Object as PropType<Ermcp.WrUserReceiptInfoRsp>,
+        default: () => ({})
+    }
+})
+
+const { loading, deleteInvoice } = useInvoiceForm(props.selectedRow)
+const show = shallowRef(true)
+const refresh = shallowRef(false)
+
+const onCancel = (isRefresh = false) => {
+    show.value = false
+    refresh.value = isRefresh
+}
+
+const onSubmit = () => {
+    deleteInvoice().then(() => {
+        ElMessage.success('提交成功')
+        onCancel(true)
+    }).catch((err) => {
+        ElMessage.error('提交失败:' + err)
+    })
+}
+</script>

+ 86 - 0
src/packages/pc/views/mine/invoice/components/edit/index.vue

@@ -0,0 +1,86 @@
+<!-- 会员中心-我的发票-编辑 -->
+<template>
+    <app-drawer :title="selectedRow?.autoid ? '修改发票' : '新增发票'" :width="460" v-model:show="show" :loading="loading"
+        :refresh="refresh">
+        <el-form ref="formRef" label-width="100px" :model="formData" :rules="formRules">
+            <el-form-item label="发票类型" prop="ReceiptType">
+                <el-radio-group v-model="formData.ReceiptType">
+                    <el-radio :label="1">个人</el-radio>
+                    <el-radio :label="2">企业</el-radio>
+                </el-radio-group>
+            </el-form-item>
+            <el-form-item label="发票抬头" prop="UserName">
+                <el-input placeholder="请输入" v-model="formData.UserName" />
+            </el-form-item>
+            <template v-if="formData.ReceiptType === 2">
+                <el-form-item label="税号" prop="TaxpayerID">
+                    <el-input placeholder="请输入" v-model="formData.TaxpayerID" />
+                </el-form-item>
+                <el-form-item label="开户银行" prop="ReceiptBank">
+                    <el-input placeholder="请输入" v-model="formData.ReceiptBank" />
+                </el-form-item>
+                <el-form-item label="银行账号" prop="ReceiptAccount">
+                    <el-input placeholder="请输入" v-model="formData.ReceiptAccount" />
+                </el-form-item>
+                <el-form-item label="企业地址" prop="Address">
+                    <el-input placeholder="请输入" v-model="formData.Address" />
+                </el-form-item>
+                <el-form-item label="企业电话" prop="ContactInfo">
+                    <el-input placeholder="请输入" v-model="formData.ContactInfo" />
+                </el-form-item>
+            </template>
+        </el-form>
+        <template #footer>
+            <el-button @click="onCancel(false)" plain>取消</el-button>
+            <el-button type="primary" @click="onSubmit">提交</el-button>
+        </template>
+    </app-drawer>
+</template>
+
+<script lang="ts" setup>
+import { ref, PropType } from 'vue'
+import { ElMessage } from 'element-plus'
+import type { FormInstance, FormRules } from 'element-plus'
+import { useInvoiceForm } from '@/business/user'
+import AppDrawer from '@pc/components/base/drawer/index.vue'
+
+const props = defineProps({
+    selectedRow: {
+        type: Object as PropType<Ermcp.WrUserReceiptInfoRsp>,
+        default: () => ({})
+    }
+})
+
+const { loading, formData, addOrUpdate } = useInvoiceForm(props.selectedRow)
+const show = ref(true)
+const refresh = ref(false)
+const formRef = ref<FormInstance>()
+
+const formRules: FormRules = {
+    ReceiptType: [{ required: true, message: '请选择发票类型' }],
+    UserName: [{ required: true, message: '请输入发票抬头', trigger: 'blur' }],
+    TaxpayerID: [{ required: true, message: '请输入税号', trigger: 'blur' }],
+    ReceiptBank: [{ required: true, message: '请输入开户银行', trigger: 'blur' }],
+    ReceiptAccount: [{ required: true, message: '请输入银行账号', trigger: 'blur' }],
+    Address: [{ required: true, message: '请输入企业地址', trigger: 'blur' }],
+    ContactInfo: [{ required: true, message: '请输入企业电话', trigger: 'blur' }],
+}
+
+const onCancel = (isRefresh = false) => {
+    show.value = false
+    refresh.value = isRefresh
+}
+
+const onSubmit = () => {
+    formRef.value?.validate((valid) => {
+        if (valid) {
+            addOrUpdate().then(() => {
+                ElMessage.success('提交成功')
+                onCancel(true)
+            }).catch((err) => {
+                ElMessage.error('提交失败:' + err)
+            })
+        }
+    })
+}
+</script>

+ 2 - 2
src/packages/pc/views/system/menu/components/edit/index.vue

@@ -88,7 +88,7 @@ const props = defineProps({
     }
 })
 
-const { loading, menus, formData, formSubmit } = useMenuForm(props.selectedRow)
+const { loading, menus, formData, addOrUpdate } = useMenuForm(props.selectedRow)
 const show = ref(true)
 const refresh = ref(false)
 
@@ -98,7 +98,7 @@ const onCancel = (isRefresh = false) => {
 }
 
 const onSubmit = () => {
-    formSubmit().then(() => {
+    addOrUpdate().then(() => {
         ElMessage.success('提交成功')
         onCancel(true)
     }).catch((err) => {

+ 2 - 2
src/packages/pc/views/warehousing/goods/components/edit/diamond.vue

@@ -128,7 +128,7 @@ const components = {
 }
 
 const emit = defineEmits(['cancel'])
-const { loading, formData, performanceId, shapeId, caratUnit, enums, warehouseList, currencyInfo, formSubmit } = useDiamondForm(Category.Diamond)
+const { loading, formData, performanceId, shapeId, caratUnit, enums, warehouseList, currencyInfo, addOrUpdate } = useDiamondForm(Category.Diamond)
 const formRef = ref<FormInstance>()
 
 const formRules: FormRules = {
@@ -184,7 +184,7 @@ const shapeChange = (value: number) => {
 const onSubmit = () => {
     formRef.value?.validate((valid) => {
         if (valid) {
-            formSubmit().then(() => {
+            addOrUpdate().then(() => {
                 ElMessage.success('提交成功')
                 emit('cancel', true)
             }).catch((err) => {

+ 2 - 2
src/packages/pc/views/warehousing/goods/components/edit/fancy.vue

@@ -132,7 +132,7 @@ const components = {
 }
 
 const emit = defineEmits(['cancel'])
-const { loading, formData, performanceId, shapeId, caratUnit, enums, warehouseList, currencyInfo, formSubmit } = useDiamondForm(Category.Fancy)
+const { loading, formData, performanceId, shapeId, caratUnit, enums, warehouseList, currencyInfo, addOrUpdate } = useDiamondForm(Category.Fancy)
 const formRef = ref<FormInstance>()
 
 const formRules: FormRules = {
@@ -197,7 +197,7 @@ const shapeChange = (value: number) => {
 const onSubmit = () => {
     formRef.value?.validate((valid) => {
         if (valid) {
-            formSubmit().then(() => {
+            addOrUpdate().then(() => {
                 ElMessage.success('提交成功')
                 emit('cancel', true)
             }).catch((err) => {

+ 2 - 2
src/packages/pc/views/warehousing/goods/components/edit/jewelry.vue

@@ -137,7 +137,7 @@ const components = {
 }
 
 const emit = defineEmits(['cancel'])
-const { loading, formData, performanceId, shapeId, enums, warehouseList, currencyInfo, formSubmit } = useDiamondForm(Category.Jewelry)
+const { loading, formData, performanceId, shapeId, enums, warehouseList, currencyInfo, addOrUpdate } = useDiamondForm(Category.Jewelry)
 const formRef = ref<FormInstance>()
 
 const formRules: FormRules = {
@@ -195,7 +195,7 @@ const shapeChange = (value: number) => {
 const onSubmit = () => {
     formRef.value?.validate((valid) => {
         if (valid) {
-            formSubmit().then(() => {
+            addOrUpdate().then(() => {
                 ElMessage.success('提交成功')
                 emit('cancel', true)
             }).catch((err) => {

+ 2 - 2
src/packages/pc/views/warehousing/goods/components/edit/rough.vue

@@ -106,7 +106,7 @@ const components = {
 }
 
 const emit = defineEmits(['cancel'])
-const { loading, formData, performanceId, caratUnit, selectedType, enums, warehouseList, currencyInfo, formSubmit } = useDiamondForm(Category.Rough)
+const { loading, formData, performanceId, caratUnit, selectedType, enums, warehouseList, currencyInfo, addOrUpdate } = useDiamondForm(Category.Rough)
 const formRef = ref<FormInstance>()
 
 const formRules: FormRules = {
@@ -164,7 +164,7 @@ const formRules: FormRules = {
 const onSubmit = () => {
     formRef.value?.validate((valid) => {
         if (valid) {
-            formSubmit().then(() => {
+            addOrUpdate().then(() => {
                 ElMessage.success('提交成功')
                 emit('cancel', true)
             }).catch((err) => {

+ 41 - 0
src/packages/pc/views/warehousing/goods/components/favorite/index.vue

@@ -0,0 +1,41 @@
+<template>
+    <app-drawer title="提示" v-model:show="show" :loading="loading" :refresh="refresh">
+        <div style="font-size:16px;text-align:center">是否收藏该商品?</div>
+        <template #footer>
+            <el-button @click="onCancel(false)" plain>取消</el-button>
+            <el-button type="primary" @click="onSubmit">确认</el-button>
+        </template>
+    </app-drawer>
+</template>
+
+<script lang="ts" setup>
+import { shallowRef } from 'vue'
+import { ElMessage } from 'element-plus'
+import { useDiamondDetails } from '@/business/goods'
+import AppDrawer from '@pc/components/base/drawer/index.vue'
+
+const props = defineProps({
+    goodsno: {
+        type: String,
+        required: true
+    },
+})
+
+const { loading, diamondFavorite } = useDiamondDetails(props.goodsno)
+const show = shallowRef(true)
+const refresh = shallowRef(false)
+
+const onCancel = (isRefresh = false) => {
+    show.value = false
+    refresh.value = isRefresh
+}
+
+const onSubmit = () => {
+    diamondFavorite().then(() => {
+        ElMessage.success('提交成功')
+        onCancel(true)
+    }).catch((err) => {
+        ElMessage.error('提交失败:' + err)
+    })
+}
+</script>

+ 2 - 2
src/packages/pc/views/warehousing/goods/index.vue

@@ -11,11 +11,11 @@
             </template>
             <!-- 颜色 -->
             <template #zscolortype="{ row }">
-                {{ `${row.zscolortype1display}-${row.zscolortype2display}` }}
+                {{ [row.zscolortype1display, row.zscolortype2display].join('-') }}
             </template>
             <!-- 净度 -->
             <template #zsclaritytype="{ row }">
-                {{ `${row.zsclaritytype1display}-${row.zsclaritytype2display}` }}
+                {{ [row.zsclaritytype1display, row.zsclaritytype2display].join('-') }}
             </template>
             <!-- 操作 -->
             <template #operate="{ row }">

+ 2 - 2
src/packages/pc/views/warehousing/warehouse/components/edit/index.vue

@@ -51,7 +51,7 @@ const props = defineProps({
     }
 })
 
-const { loading, formData, accountName, formSubmit } = useWarehouseForm(props.selectedRow)
+const { loading, formData, accountName, addOrUpdate } = useWarehouseForm(props.selectedRow)
 const show = ref(true)
 const refresh = ref(false)
 const formRef = ref<FormInstance>()
@@ -84,7 +84,7 @@ const onCancel = (isRefresh = false) => {
 const onSubmit = () => {
     formRef.value?.validate((valid) => {
         if (valid) {
-            formSubmit().then(() => {
+            addOrUpdate().then(() => {
                 ElMessage.success('提交成功')
                 onCancel(true)
             }).catch((err) => {

+ 1 - 0
src/packages/pc/views/warehousing/warehouse/index.vue

@@ -5,6 +5,7 @@
             <template #header>
                 <app-auth-operation :menus="['add']" @closed="getWarehouseList" />
             </template>
+            <!-- 操作 -->
             <template #operate="{ row }">
                 <app-auth-operation :menus="['edit']" :options="{ selectedRow: row }" @closed="getWarehouseList" />
             </template>

+ 7 - 0
src/services/api/goods/index.ts

@@ -30,4 +30,11 @@ export function queryDiamondDetails(params: HttpRequest<{ req: Ermcp.DiamondDeta
  */
 export function addZSGoods(params: TradeRequest<Proto.AddZSGoodsReq, Proto.AddZSGoodsRsp>) {
     return tradeServerRequest('AddZSGoodsReq', 'AddZSGoodsRsp', params, Market.GZ);
+}
+
+/**
+ * 商品收藏操作
+ */
+export function goodsFavoriteOperate(params: TradeRequest<Proto.GoodsFavoriteOperateReq, Proto.GoodsFavoriteOperateRsp>) {
+    return tradeServerRequest('GoodsFavoriteOperateReq', 'GoodsFavoriteOperateRsp', params);
 }

+ 21 - 0
src/types/proto/goods.d.ts

@@ -73,5 +73,26 @@ declare global {
             ZSCZColor2Type: number; // 彩钻颜色2
             ZSCZColor3Type: number; // 彩钻颜色3
         }
+
+        // 商品收藏操作接口请求
+        interface GoodsFavoriteOperateReq {
+            Header?: IMessageHead; // 消息头
+            UserID: number; // 用户ID,必填
+            WRTradeOrderID: number; // 委托单ID,必填
+            OperateType: number; // 操作类型,1:添加2:删除,必填
+            ClientType: number; // 终端类型
+            MarketID: number; // 市场ID,必填
+            ClientSerialNo: string; // 客户端流水号
+        }
+
+        // 商品收藏操作接口应答
+        interface GoodsFavoriteOperateRsp {
+            Header?: IMessageHead; // 消息头
+            RetCode: number; // 返回码
+            RetDesc: string; // 描述信息
+            UserID: number; // 用户ID
+            WRTradeOrderID: number; // 委托单ID
+            ClientSerialNo: string; // 客户端流水号
+        }
     }
 }

+ 2 - 2
src/types/proto/order.d.ts

@@ -174,12 +174,12 @@ declare global {
             Header?: IMessageHead; // 消息头
             UserID: number; // 用户ID,必填
             AccountID: number; // 资金账户ID,必填
-            BuyWRTradeOrderID: number; // 买挂牌委托单ID,必填
+            BuyWRTradeOrderID: Long; // 买挂牌委托单ID,必填
             WRStandardID: number; // 现货商品ID,必填
             WRFactorTypeID?: number; // 仓单要素类型ID,必填
             ApplyQty: number; // 申请数量,必填,2位小数
             ApplyPrice: number; // 申请价格,必填,2位小数
-            LadingBillID: number; // 提单ID,必填
+            LadingBillID: Long; // 提单ID,必填
             SubNum: number; // 提单子单号,必填
             ApplyRemark?: string; // 备注
             ClientType: number; // 终端类型

+ 6 - 6
src/types/proto/user.d.ts

@@ -5,19 +5,19 @@ declare global {
         /** 新增修改收货地址请求 */
         interface UserReceiveInfoReq {
             Header?: IMessageHead;
-            ClientSerialID: number; // 客户端唯一ID
+            ClientSerialID?: number; // 客户端唯一ID
             UserID: number; // 用户ID
             ReceiverName: string; // 提货人姓名
-            CardTypeID?: number; // 证件类型
+            CardTypeID: number; // 证件类型
             CardNum: string; // 证件号码
             PhoneNum: string; // 提货人联系方式
-            CountryID: number; // 国家
+            CountryID?: number; // 国家
             ProvinceID?: number; // 省
             CityID?: number; // 市
             DistrictID?: number; // 地区
             Address: string; // 提货人详细地址
             TakeRemark: string; // 提货备注
-            ReceiveInfoId?: number; // 修改时填收货地址id
+            ReceiveInfoId: number; // 修改时填收货地址id
         }
 
         /** 新增修改收货地址请求响应 */
@@ -59,7 +59,7 @@ declare global {
         /** 新增修改用户发票信息请求 */
         interface UserReceiptInfoReq {
             Header?: IMessageHead;
-            ClientSerialID: number; // 客户端唯一ID
+            ClientSerialID?: number; // 客户端唯一ID
             UserID: number; // 用户ID
             UserName: string; // 发票抬头姓名
             ReceiptType: number; // 发票类型
@@ -69,7 +69,7 @@ declare global {
             ReceiptBank: string; // 发票开户行[发票类型:企业]
             ReceiptAccount: string; // 发票帐号[发票类型:企业]
             Address: string; // 地址[发票类型:企业]
-            IDNum: string; // 身份证号码[发票类型:个人]
+            IDNum?: string; // 身份证号码[发票类型:个人]
         }
 
         /** 新增修改用户发票信息响应 */