li.shaoyi 3 年之前
父节点
当前提交
56427bf2ad

+ 5 - 12
src/business/bargain/index.ts

@@ -248,8 +248,7 @@ export function useSellBargain() {
  * @returns 
  */
 export function useBargainOperate(selectedRow: Ermcp.MyBargainApplyRsp | Ermcp.MyDelistingApplyRsp) {
-    const { loginInfo } = useLoginStore()
-    const { UserID, AccountIDs } = loginInfo.value
+    const { getUserId, getFirstAccountId } = useLoginStore()
     const loading = shallowRef(false)
 
     const formData = reactive<{ AuditRemark: string }>({
@@ -263,11 +262,8 @@ export function useBargainOperate(selectedRow: Ermcp.MyBargainApplyRsp | Ermcp.M
         if ('wrbargainid' in selectedRow) {
             return zsBuyOrderDestingNegPriceOperate({
                 data: {
-                    Header: {
-                        AccountID: AccountIDs[0],
-                    },
-                    UserID, // 用户ID,必填
-                    AccountID: AccountIDs[0], // 资金账号,必填
+                    UserID: getUserId(), // 用户ID,必填
+                    AccountID: getFirstAccountId(), // 资金账号,必填
                     WRBargainID: Long.fromString(selectedRow.wrbargainid), // 议价申请单ID,必填
                     OperateType, // 操作类型,1:撤销2:拒绝3:同意
                     AuditRemark: formData.AuditRemark,
@@ -286,11 +282,8 @@ export function useBargainOperate(selectedRow: Ermcp.MyBargainApplyRsp | Ermcp.M
         if ('selldelistingapplyid' in selectedRow) {
             return zsSellOrderDestingApplyOperate({
                 data: {
-                    Header: {
-                        AccountID: AccountIDs[0],
-                    },
-                    UserID, // 用户ID,必填
-                    AccountID: AccountIDs[0], // 资金账号,必填
+                    UserID: getUserId(), // 用户ID,必填
+                    AccountID: getFirstAccountId(), // 资金账号,必填
                     SellDelistingApplyID: Long.fromString(selectedRow.selldelistingapplyid), // 卖摘牌申请ID,必填
                     OperateType, // 操作类型,1:撤销2:拒绝3:同意
                     AuditRemark: formData.AuditRemark,

+ 74 - 0
src/business/customs/bonded.ts

@@ -0,0 +1,74 @@
+import { shallowRef } from 'vue'
+import { useDataTable } from '@/hooks/datatable'
+import { getTableColumns } from '@/business/table'
+import { queryGZBSFWOrder, queryGZCJBSOrderFile } from '@/services/api/customs'
+import { useLoginStore } from '@/stores'
+
+// 保税服务
+export function useBSFWOrderList() {
+    const { getUserId } = useLoginStore()
+    const { dataList, total, pageIndex, pageSize } = useDataTable<Ermcp.GZBSFWOrderRsp>()
+    const loading = shallowRef(false)
+    const columns = shallowRef(getTableColumns('customs_bsfw'))
+
+    const getBSFWOrderList = () => {
+        loading.value = true
+        return queryGZBSFWOrder({
+            data: {
+                page: pageIndex.value,
+                pagesize: pageSize.value,
+                userid: getUserId(),
+            },
+            success: (res) => {
+                total.value = res.total
+                dataList.value = res.data
+            },
+            complete: () => {
+                loading.value = false
+            }
+        })
+    }
+
+    return {
+        loading,
+        dataList,
+        total,
+        pageIndex,
+        pageSize,
+        columns,
+        getBSFWOrderList,
+    }
+}
+
+// 出境文件下载
+export function useGZCJBSOrderFileList(orderid: number) {
+    const { dataList, total, pageIndex, pageSize } = useDataTable<Ermcp.GZCJBSOrderFileRsp>()
+    const loading = shallowRef(false)
+    const columns = shallowRef(getTableColumns('customs_bsfw_file'))
+
+    const getGZCJBSOrderFileList = () => {
+        loading.value = true
+        return queryGZCJBSOrderFile({
+            data: {
+                orderid,
+            },
+            success: (res) => {
+                total.value = res.total
+                dataList.value = res.data
+            },
+            complete: () => {
+                loading.value = false
+            }
+        })
+    }
+
+    return {
+        loading,
+        dataList,
+        total,
+        pageIndex,
+        pageSize,
+        columns,
+        getGZCJBSOrderFileList,
+    }
+}

+ 57 - 16
src/business/customs/index.ts → src/business/customs/exit.ts

@@ -2,12 +2,12 @@ import { shallowRef, reactive } from 'vue'
 import { v4 } from 'uuid'
 import { useDataTable } from '@/hooks/datatable'
 import { getTableColumns } from '@/business/table'
-import { cjjcApply, queryGZCJJCOrder } from '@/services/api/customs'
+import { cjjcApply, queryGZCJJCOrder, cjjcMemberOperate, queryGZCJJCOrderDetail } from '@/services/api/customs'
 import { ClientType } from '@/constants/client'
 import { useLoginStore } from '@/stores'
 
 // 出境检测
-export function useCJJCOrder() {
+export function useCJJCOrderList() {
     const { getUserId } = useLoginStore()
     const { dataList, total, pageIndex, pageSize } = useDataTable<Ermcp.GZCJJCOrderRsp>()
     const loading = shallowRef(false)
@@ -42,16 +42,13 @@ export function useCJJCOrder() {
     }
 }
 
-// 出境检测
-export function useCJJCOrderEdit(selectedRow?: Ermcp.GZCJJCOrderRsp) {
+// 出境检测申请
+export function useCJJCOrderApply(selectedRow?: Ermcp.GZCJJCOrderRsp) {
     const { loginInfo, getFirstAccountId } = useLoginStore()
     const { UserID, LoginID, LoginCode } = loginInfo.value
     const loading = shallowRef(false)
 
     const formData = reactive<Partial<Proto.CJJCApplyReq>>({
-        Header: {
-            AccountID: getFirstAccountId(),
-        },
         UserID,
         AccountID: getFirstAccountId(),
         OperateID: LoginID, // 操作人ID,LoginAccount的LoginID,必填
@@ -80,6 +77,30 @@ export function useCJJCOrderEdit(selectedRow?: Ermcp.GZCJJCOrderRsp) {
             origincountry: formData.ZSOrigin,
             gzcjdeliverytype: formData.GZCJDeliveryType,
         } = selectedRow)
+
+        queryGZCJJCOrderDetail({
+            data: {
+                userid: UserID,
+                orderid: selectedRow.orderid,
+            },
+            success: (res) => {
+                res.data.forEach((e) => {
+                    formData.GZCJCategoryDetails?.push({
+                        OrderIndex: e.orderindex,
+                        GZNo: e.gzno,
+                        GZCJShapeType: e.gzcjshapetype,
+                        Weight: e.weight,
+                        Amount: e.amount,
+                        ColorInfo: e.colorinfo,
+                        Remark: e.remark,
+                        GZCJMarkType: e.gzcjmarktype,
+                        GZCJPublishType: e.gzcjpublishtype,
+                        GZCJServiceType: e.gzcjservicetype,
+                        OriginCertNo: e.origincertno,
+                    })
+                })
+            }
+        })
     }
 
     const formSubmit = () => {
@@ -102,18 +123,38 @@ export function useCJJCOrderEdit(selectedRow?: Ermcp.GZCJJCOrderRsp) {
     }
 }
 
-// 保税服务
-export function useBSFWOrder() {
-    const { dataList, total, pageIndex, pageSize } = useDataTable<Ermcp.GZBSFWOrderRsp>()
+// 出境检测操作
+export function useCJJCOrderOperate(OrderID: number) {
+    const { loginInfo } = useLoginStore()
+    const { UserID, LoginID, LoginCode } = loginInfo.value
     const loading = shallowRef(false)
-    const columns = shallowRef(getTableColumns('customs_bsfw'))
+
+    const formData = reactive<Proto.CJJCMemberOperateReq>({
+        UserID, // 用户ID,必填
+        OperateID: LoginID, // 操作人ID,必填,LoginAccount的LoginID
+        OperateAccount: LoginCode || LoginID.toString(), // 操作人账户,LoginAccount的LoginCode,LoginCode为空则填LoginID,必
+        OrderID, // 单据ID,必填
+        OperateType: 0, // 操作类型,必填,1:撤回2:确认发货3:确认检测结果
+        ClientType: ClientType.Web, // 终端类型
+        ClientSerialNo: '', // 客户端流水号
+    })
+
+    const formSubmit = () => {
+        loading.value = true
+        return cjjcMemberOperate({
+            data: {
+                ...formData,
+                ClientSerialNo: v4(),
+            },
+            complete: () => {
+                loading.value = false
+            }
+        })
+    }
 
     return {
         loading,
-        dataList,
-        total,
-        pageIndex,
-        pageSize,
-        columns,
+        formData,
+        formSubmit,
     }
 }

+ 8 - 2
src/business/table/index.ts

@@ -2,7 +2,7 @@ import { shallowRef } from 'vue'
 import { useTableColumnStore } from '@/stores'
 
 type TableColumnKey = typeof tableColumnKeys[number]
-const tableColumnKeys = ['system_menu', 'system_role', 'warehousing_diamond', 'warehousing_warehouse', 'mine_capital', 'listing_sellorder', 'listing_buyorder', 'listing_saleorder', 'listing_purchaseorder', 'listing_delisting', 'listing_bargain_buy', 'listing_bargain_sell', 'mine_address', 'mine_invoice', 'favorite', 'order', 'order_step', 'bargain_buy', 'bargain_sell', 'customs_cjjc', 'customs_bsfw'] as const
+const tableColumnKeys = ['system_menu', 'system_role', 'warehousing_diamond', 'warehousing_warehouse', 'mine_capital', 'listing_sellorder', 'listing_buyorder', 'listing_saleorder', 'listing_purchaseorder', 'listing_delisting', 'listing_bargain_buy', 'listing_bargain_sell', 'mine_address', 'mine_invoice', 'favorite', 'order', 'order_step', 'bargain_buy', 'bargain_sell', 'customs_cjjc', 'customs_bsfw', 'customs_bsfw_file'] as const
 
 /**
  * PC端表格列
@@ -294,7 +294,7 @@ const pcTableColumnMap = new Map<TableColumnKey, Ermcp.TableColumn[]>([
         { prop: 'contactname', label: '联系人姓名' },
         { prop: 'contactphoneno', label: '联系人电话' },
         { prop: 'gzcjstatusdisplay', label: '单据状态' },
-        { prop: 'operate', label: '操作', width: 850 }
+        { prop: 'operate', label: '操作', width: 180 }
     ]],
     // 交易服务-保税服务
     ['customs_bsfw', [
@@ -309,6 +309,12 @@ const pcTableColumnMap = new Map<TableColumnKey, Ermcp.TableColumn[]>([
         { prop: 'gzbsstatusdisplay', label: '单据状态' },
         { prop: 'operate', label: '操作', width: 180 }
     ]],
+    // 交易服务-保税服务-文件下载
+    ['customs_bsfw_file', [
+        { prop: 'filename', label: '文件名' },
+        { prop: 'operatetime', label: '生成时间' },
+        { prop: 'operate', label: '操作', width: 180 }
+    ]],
 ])
 
 /**

+ 0 - 9
src/business/trade/desting.ts

@@ -21,9 +21,6 @@ export function useBuyOrderDesting(selectedRow: Ermcp.DiamondDetailsRsp) {
         loading.value = true
         return zsBuyOrderDesting({
             data: {
-                Header: {
-                    AccountID: getFirstAccountId(),
-                },
                 UserID: getUserId(),
                 AccountID: getFirstAccountId(),
                 RelatedWRTradeOrderID: Long.fromString(selectedRow.wrtradeorderid),
@@ -56,9 +53,6 @@ export function useBuyOrderBargain(selectedRow: Ermcp.DiamondDetailsRsp) {
     const loading = shallowRef(false)
 
     const formData = reactive<Proto.ZSBuyOrderDestingNegPriceReq>({
-        Header: {
-            AccountID: getFirstAccountId(),
-        },
         UserID: getUserId(), // 用户ID,必填
         AccountID: getFirstAccountId(), // 资金账号,必填
         RelatedOrderID: Long.fromString(selectedRow.wrtradeorderid), // 卖委托单号,必填
@@ -101,9 +95,6 @@ export function useSellOrderBargain(selectedRow: Ermcp.BuyOrderRsp) {
     const loading = shallowRef(false)
 
     const formData = reactive<Proto.ZSSellOrderDestingApplyReq>({
-        Header: {
-            AccountID: getFirstAccountId(),
-        },
         UserID: getUserId(), // 用户ID,必填
         AccountID: getFirstAccountId(), // 资金账户ID,必填
         BuyWRTradeOrderID: Long.fromString(selectedRow.wrtradeorderid), // 买挂牌委托单ID,必填

+ 1 - 11
src/business/trade/listing.ts

@@ -76,9 +76,6 @@ export function useBuyOrderListing() {
         }
         return zsBuyOrderListing({
             data: {
-                Header: {
-                    AccountID: getFirstAccountId(),
-                },
                 UserID: getUserId(),
                 AccountID: getFirstAccountId(),
                 MarketID: Market.GZ,
@@ -136,9 +133,6 @@ export function useSellOrderListing(selectedRow?: Ermcp.MyWRPositionRsp) {
     ])
 
     const formData = reactive<Proto.ZSSellOrderListingReq>({
-        Header: {
-            AccountID: getFirstAccountId(),
-        },
         UserID: getUserId(),
         AccountID: getFirstAccountId(),
         WRStandardID: wrstandardid,
@@ -206,17 +200,13 @@ export function useListingCancel(wrtradeorderid: string, buyorsell: number) {
     const { getUserId, getFirstAccountId } = useLoginStore()
     const loading = shallowRef(false)
     const userId = getUserId()
-    const accountId = getFirstAccountId()
 
     const formSubmit = () => {
         loading.value = true
         return wrListingCancelOrder({
             data: {
-                Header: {
-                    AccountID: accountId,
-                },
                 UserID: userId, // 用户ID
-                AccountID: accountId, // 资金账号
+                AccountID: getFirstAccountId(), // 资金账号
                 OldWRTradeOrderID: Long.fromString(wrtradeorderid), // 目标仓单贸易委托单ID
                 OrderSrc: 1, // 委托来源
                 ClientType: ClientType.Web, // 终端类型

+ 33 - 6
src/constants/customs.ts

@@ -122,19 +122,19 @@ export function getGZCJServiceTypeName(value?: number) {
 }
 
 /**
- * 单据状态
+ * 出境检测状态
  */
 export enum GZCJStatus {
     Audit = 1, // 待审核
     Shipping = 2, // 发货中
-    Checking = 8, // 检测结果确认中
-    Minutes60 = 10, // 预付款确认中
-    Hours2 = 13, // 付款确认中
+    CheckConfirm = 8, // 检测结果确认中
+    AdvancePaymentConfirm = 10, // 预付款确认中
+    PaymentConfirm = 13, // 付款确认中
     Uncommitted = 22, // 未提交
 }
 
 /**
- * 获取单据状态列表
+ * 获取出境检测状态列表
  * @returns 
  */
 export function getGZCJStatusList() {
@@ -142,10 +142,37 @@ export function getGZCJStatusList() {
 }
 
 /**
- * 获取单据状态名称
+ * 获取出境检测状态名称
  * @returns 
  */
 export function getGZCJStatusName(value?: number) {
     const enums = getGZCJStatusList()
     return getEnumTypeName(enums, value)
+}
+
+/**
+ * 保税服务状态
+ */
+export enum GZBSStatus {
+    UploadBill = 1, // 发货单上传中
+    UploadSeal = 3, // 单据盖章中
+    AdvancePaymentConfirm = 5, // 预付款确认中
+    PaymentConfirm = 11, // 付款确认中
+}
+
+/**
+ * 获取保税服务状态列表
+ * @returns 
+ */
+export function getGZBSStatusList() {
+    return getEnumTypeList('GZBSStatus')
+}
+
+/**
+ * 获取保税服务状态名称
+ * @returns 
+ */
+export function getGZBSStatusName(value?: number) {
+    const enums = getGZBSStatusList()
+    return getEnumTypeName(enums, value)
 }

+ 98 - 9
src/mock/router.ts

@@ -84,7 +84,7 @@ const appmenu = {
             },
             {
                 authType: 1,
-                sort: 2,
+                sort: 3,
                 title: '钻石首饰',
                 code: 'search_jewelry',
                 url: '/search/jewelry',
@@ -94,7 +94,7 @@ const appmenu = {
             },
             {
                 authType: 1,
-                sort: 3,
+                sort: 4,
                 title: '挂牌大厅',
                 code: 'trade',
                 url: '/trade',
@@ -278,7 +278,7 @@ const appmenu = {
             },
             {
                 authType: 1,
-                sort: 3,
+                sort: 5,
                 title: '我的收藏',
                 code: 'favorite',
                 url: '/favorite',
@@ -306,7 +306,7 @@ const appmenu = {
             },
             {
                 authType: 1,
-                sort: 3,
+                sort: 6,
                 title: '订单管理',
                 code: 'order',
                 url: '/order',
@@ -420,7 +420,7 @@ const appmenu = {
             },
             {
                 authType: 1,
-                sort: 3,
+                sort: 7,
                 title: '交易服务',
                 code: 'customs',
                 url: '/customs',
@@ -519,12 +519,62 @@ const appmenu = {
                         url: 'bonded',
                         urlType: 1,
                         component: 'views/customs/bonded/index.vue',
+                        children: [
+                            {
+                                authType: 3,
+                                title: '详情',
+                                code: 'customs_bonded_details',
+                                component: 'views/customs/bonded/components/details/index.vue',
+                                buttonName: 'details',
+                                buttonType: 'primary',
+                            },
+                            {
+                                authType: 3,
+                                title: '上传发货单',
+                                code: 'customs_bonded_upload_bill',
+                                component: 'views/customs/bonded/components/upload-bill/index.vue',
+                                buttonName: 'upload_bill',
+                                buttonType: 'primary',
+                            },
+                            {
+                                authType: 3,
+                                title: '下载',
+                                code: 'customs_bonded_download',
+                                component: 'views/customs/bonded/components/download/index.vue',
+                                buttonName: 'download',
+                                buttonType: 'primary',
+                            },
+                            {
+                                authType: 3,
+                                title: '上传盖章单据',
+                                code: 'customs_bonded_upload_seal',
+                                component: 'views/customs/bonded/components/upload-seal/index.vue',
+                                buttonName: 'upload_seal',
+                                buttonType: 'primary',
+                            },
+                            {
+                                authType: 3,
+                                title: '确认预付款',
+                                code: 'customs_bonded_advance_payment',
+                                component: 'views/customs/bonded/components/advance-payment/index.vue',
+                                buttonName: 'advance_payment',
+                                buttonType: 'primary',
+                            },
+                            {
+                                authType: 3,
+                                title: '确认付款',
+                                code: 'customs_bonded_payment',
+                                component: 'views/customs/bonded/components/payment/index.vue',
+                                buttonName: 'payment',
+                                buttonType: 'primary',
+                            },
+                        ]
                     },
                 ]
             },
             {
                 authType: 1,
-                sort: 4,
+                sort: 8,
                 title: '我的仓储',
                 code: 'warehousing',
                 url: '/warehousing',
@@ -622,7 +672,7 @@ const appmenu = {
             },
             {
                 authType: 1,
-                sort: 5,
+                sort: 9,
                 title: '会员中心',
                 code: 'mine',
                 url: '/mine',
@@ -792,7 +842,46 @@ const appmenu = {
             },
             {
                 authType: 1,
-                sort: 1,
+                sort: 10,
+                title: '报表',
+                code: 'report',
+                url: '/report',
+                urlType: 1,
+                component: 'Main',
+                icon: 'TrendCharts',
+                children: [
+                    {
+                        authType: 1,
+                        sort: 1,
+                        title: '会员报表',
+                        code: 'report_member',
+                        url: '',
+                        urlType: 1,
+                        component: 'views/report/member/index.vue',
+                    },
+                    {
+                        authType: 1,
+                        sort: 2,
+                        title: '仓储报表',
+                        code: 'report_warehousing',
+                        url: 'warehousing',
+                        urlType: 1,
+                        component: 'views/report/warehousing/index.vue',
+                    },
+                    {
+                        authType: 1,
+                        sort: 3,
+                        title: '交易报表',
+                        code: 'report_trade',
+                        url: 'trade',
+                        urlType: 1,
+                        component: 'views/report/trade/index.vue',
+                    },
+                ]
+            },
+            {
+                authType: 1,
+                sort: 11,
                 title: '询价消息',
                 code: 'bargain',
                 url: '/bargain',
@@ -859,7 +948,7 @@ const appmenu = {
             },
             {
                 authType: 1,
-                sort: 6,
+                sort: 12,
                 title: '系统管理',
                 code: 'system',
                 url: '/system',

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

@@ -1,12 +1,12 @@
 .app-table {
     &__header {
-        margin-bottom  : 20px;
-        display        : flex;
+        margin-bottom: 20px;
+        display: flex;
         justify-content: space-between;
-        align-items    : center;
+        align-items: center;
 
         >div {
-            display    : flex;
+            display: flex;
             align-items: center;
 
             >*:not(:first-child):last-child {
@@ -24,22 +24,22 @@
     }
 
     .el-table {
-        --el-table-bg-color              : transparent; //表格背景颜色
-        --el-table-text-color            : #000; //表格文字颜色
-        --el-table-border-color          : #ebeef5; // 表格边框颜色
-        --el-table-border                : 1px solid var(--el-table-border-color); // 表格边框
-        --el-table-header-bg-color       : #f1f5f9; // 表头背景颜色
-        --el-table-header-text-color     : #556772; // 表头文字颜色
-        --el-table-tr-bg-color           : var(--el-table-bg-color); // 表格行背景颜色
-        --el-table-row-hover-bg-color    : #f5f7fa; // 表格行鼠标经过背景色
+        --el-table-bg-color: transparent; //表格背景颜色
+        --el-table-text-color: #000; //表格文字颜色
+        --el-table-border-color: #ebeef5; // 表格边框颜色
+        --el-table-border: 1px solid var(--el-table-border-color); // 表格边框
+        --el-table-header-bg-color: #f1f5f9; // 表头背景颜色
+        --el-table-header-text-color: #556772; // 表头文字颜色
+        --el-table-tr-bg-color: var(--el-table-bg-color); // 表格行背景颜色
+        --el-table-row-hover-bg-color: #f5f7fa; // 表格行鼠标经过背景色
         --el-table-expanded-cell-bg-color: var(--el-table-bg-color); // 展开行背景颜色
-        --el-table-current-row-bg-color  : #f5f7fa; // 当前行高亮颜色
+        --el-table-current-row-bg-color: #f5f7fa; // 当前行高亮颜色
 
         width: 100%;
 
         th.el-table__cell {
             font-weight: normal;
-            padding    : 8px 0;
+            padding: 8px 0;
         }
 
         td.el-table__cell {

+ 36 - 36
src/packages/pc/components/layouts/sidebar/index.less

@@ -1,35 +1,35 @@
 .app-sidebar {
     &__view {
-        display       : flex;
+        display: flex;
         flex-direction: column;
-        min-height    : 100%;
-        color         : #fff;
-        background    : var(--sidebar-background);
+        min-height: 100%;
+        color: #fff;
+        background: var(--sidebar-background);
     }
 
     &__header,
     &__copyright {
-        display    : inline-flex;
-        width      : 0;
-        height     : 0;
+        display: inline-flex;
+        width: 0;
+        max-height: 0;
         white-space: nowrap;
-        overflow   : hidden;
-        transition : all 300ms;
+        overflow: hidden;
+        transition: all 300ms;
 
         &.is-hide {
-            border : 0;
+            border: 0;
             padding: 0;
         }
     }
 
     &__header {
-        align-items  : center;
-        padding      : 0 20px;
+        align-items: center;
+        padding: 0 20px;
         border-bottom: var(--sidebar-header-border);
 
         &:not(.is-hide) {
-            width : var(--sidebar-width);
-            height: var(--sidebar-header-height);
+            width: var(--sidebar-width);
+            min-height: var(--sidebar-header-height);
         }
 
         .logo {
@@ -39,20 +39,20 @@
 
     &__copyright {
         flex-direction: column;
-        font-size     : 12px;
-        height        : auto;
-        line-height   : 20px;
-        color         : #697b8f;
-        padding       : 10px;
-        margin-top    : auto;
+        font-size: 12px;
+        line-height: 20px;
+        color: #697b8f;
+        padding: 10px;
+        margin-top: auto;
 
         &:not(.is-hide) {
             width: var(--sidebar-width);
+            max-height: none;
         }
 
         a {
             display: block;
-            color  : inherit;
+            color: inherit;
         }
     }
 
@@ -60,7 +60,7 @@
         --el-menu-item-height: 44px;
 
         .el-menu {
-            border          : 0;
+            border: 0;
             background-color: transparent;
 
             &:not(&--collapse) {
@@ -74,25 +74,25 @@
             &--collapse {
                 .menu-icon {
                     &--text {
-                        display       : inline-block;
+                        display: inline-block;
                         vertical-align: middle;
-                        width         : 24px;
-                        text-align    : center;
+                        width: 24px;
+                        text-align: center;
                     }
                 }
             }
 
             .el-menu-item {
-                color    : var(--sidebar-menu-item);
+                color: var(--sidebar-menu-item);
                 min-width: auto;
 
                 &:hover {
-                    color           : #fff;
+                    color: #fff;
                     background-color: var(--sidebar-menu-item-hover);
                 }
 
                 &.is-active {
-                    color           : #fff;
+                    color: #fff;
                     background-color: var(--sidebar-menu-item-active);
                 }
             }
@@ -101,8 +101,8 @@
 
     /* 适配小屏设备 */
     [screen='small'] & {
-        position  : fixed;
-        z-index   : 2000;
+        position: fixed;
+        z-index: 2000;
         transition: transform 200ms;
 
         &.is-hide {
@@ -110,12 +110,12 @@
         }
 
         &__mask {
-            position        : fixed;
-            top             : 0;
-            left            : 0;
-            z-index         : -1;
-            width           : 100%;
-            height          : 100%;
+            position: fixed;
+            top: 0;
+            left: 0;
+            z-index: -1;
+            width: 100%;
+            height: 100%;
             background-color: rgba(0, 0, 0, .35);
 
             &.is-hide {

+ 30 - 4
src/packages/pc/views/customs/bonded/index.vue

@@ -5,20 +5,46 @@
         <app-table :data="dataList" v-model:columns="columns" :loading="loading">
             <!-- 操作 -->
             <template #operate="{ row }">
-                <app-auth-operation :options="{ selectedRow: row }" />
+                <app-auth-operation :menus="handleOperateButtons(row)" :options="{ selectedRow: row }"
+                    @closed="getBSFWOrderList" />
             </template>
             <template #footer>
-                <app-pagination :total="total" v-model:page-size="pageSize" v-model:page-index="pageIndex" />
+                <app-pagination :total="total" v-model:page-size="pageSize" v-model:page-index="pageIndex"
+                    @change="getBSFWOrderList" />
             </template>
         </app-table>
     </app-view>
 </template>
 
 <script lang="ts" setup>
-import { useBSFWOrder } from '@/business/customs'
+import { ElMessage } from 'element-plus'
+import { GZBSStatus } from '@/constants/customs'
+import { useBSFWOrderList } from '@/business/customs/bonded'
 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'
 
-const { loading, dataList, columns, total, pageIndex, pageSize } = useBSFWOrder()
+const { loading, dataList, columns, total, pageIndex, pageSize, getBSFWOrderList } = useBSFWOrderList()
+
+const handleOperateButtons = (row: Ermcp.GZBSFWOrderRsp) => {
+    switch (row.gzbsstatus) {
+        case GZBSStatus.UploadBill: {
+            return ['customs_bonded_details', 'customs_bonded_download', 'customs_bonded_upload_bill']
+        }
+        case GZBSStatus.UploadSeal: {
+            return ['customs_bonded_upload_seal']
+        }
+        case GZBSStatus.AdvancePaymentConfirm: {
+            return ['customs_bonded_advance_payment']
+        }
+        case GZBSStatus.PaymentConfirm: {
+            return ['customs_bonded_payment']
+        }
+        default: {
+            return ['customs_bonded_details', 'customs_bonded_download']
+        }
+    }
+}
+
+getBSFWOrderList().catch((err) => ElMessage.error(err))
 </script>

+ 43 - 0
src/packages/pc/views/customs/exit/components/cancel/index.vue

@@ -0,0 +1,43 @@
+<!-- 交易服务-出境检测-撤回 -->
+<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 { useCJJCOrderOperate } from '@/business/customs/exit'
+import AppDrawer from '@pc/components/base/drawer/index.vue'
+
+const props = defineProps({
+    selectedRow: {
+        type: Object as PropType<Ermcp.GZCJJCOrderRsp>,
+        required: true
+    },
+})
+
+const { loading, formData, formSubmit } = useCJJCOrderOperate(props.selectedRow.orderid)
+const show = shallowRef(true)
+const refresh = shallowRef(false)
+
+const onCancel = (isRefresh = false) => {
+    show.value = false
+    refresh.value = isRefresh
+}
+
+const onSubmit = () => {
+    formData.OperateType = 1
+    formSubmit().then(() => {
+        ElMessage.success('提交成功')
+        onCancel(true)
+    }).catch((err) => {
+        ElMessage.error('提交失败:' + err)
+    })
+}
+</script>

+ 50 - 0
src/packages/pc/views/customs/exit/components/check/index.vue

@@ -0,0 +1,50 @@
+<!-- 交易服务-出境检测-确认检测结果 -->
+<template>
+    <app-drawer title="确认检测结果" v-model:show="show" :loading="loading" :refresh="refresh">
+        <el-form ref="formRef" class="el-form--horizontal" label-width="100px" :model="formData">
+            <el-form-item label="单据编号">
+                {{ selectedRow.orderid }}
+            </el-form-item>
+            <el-form-item class="el-form-item--row" label="备注" prop="Remark">
+                <el-input type="textarea" v-model="formData.Remark" />
+            </el-form-item>
+        </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 { shallowRef, PropType } from 'vue'
+import { ElMessage } from 'element-plus'
+import { useCJJCOrderOperate } from '@/business/customs/exit'
+import AppDrawer from '@pc/components/base/drawer/index.vue'
+
+const props = defineProps({
+    selectedRow: {
+        type: Object as PropType<Ermcp.GZCJJCOrderRsp>,
+        required: true
+    },
+})
+
+const { loading, formData, formSubmit } = useCJJCOrderOperate(props.selectedRow.orderid)
+const show = shallowRef(true)
+const refresh = shallowRef(false)
+
+const onCancel = (isRefresh = false) => {
+    show.value = false
+    refresh.value = isRefresh
+}
+
+const onSubmit = () => {
+    formData.OperateType = 3
+    formSubmit().then(() => {
+        ElMessage.success('提交成功')
+        onCancel(true)
+    }).catch((err) => {
+        ElMessage.error('提交失败:' + err)
+    })
+}
+</script>

+ 50 - 0
src/packages/pc/views/customs/exit/components/delivery/index.vue

@@ -0,0 +1,50 @@
+<!-- 交易服务-出境检测-出境发货 -->
+<template>
+    <app-drawer title="出境发货" v-model:show="show" :loading="loading" :refresh="refresh">
+        <el-form ref="formRef" class="el-form--horizontal" label-width="100px" :model="formData">
+            <el-form-item label="单据编号">
+                {{ selectedRow.orderid }}
+            </el-form-item>
+            <el-form-item class="el-form-item--row" label="备注" prop="Remark">
+                <el-input type="textarea" v-model="formData.Remark" />
+            </el-form-item>
+        </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 { shallowRef, PropType } from 'vue'
+import { ElMessage } from 'element-plus'
+import { useCJJCOrderOperate } from '@/business/customs/exit'
+import AppDrawer from '@pc/components/base/drawer/index.vue'
+
+const props = defineProps({
+    selectedRow: {
+        type: Object as PropType<Ermcp.GZCJJCOrderRsp>,
+        required: true
+    },
+})
+
+const { loading, formData, formSubmit } = useCJJCOrderOperate(props.selectedRow.orderid)
+const show = shallowRef(true)
+const refresh = shallowRef(false)
+
+const onCancel = (isRefresh = false) => {
+    show.value = false
+    refresh.value = isRefresh
+}
+
+const onSubmit = () => {
+    formData.OperateType = 2
+    formSubmit().then(() => {
+        ElMessage.success('提交成功')
+        onCancel(true)
+    }).catch((err) => {
+        ElMessage.error('提交失败:' + err)
+    })
+}
+</script>

+ 31 - 0
src/packages/pc/views/customs/exit/components/details/index.less

@@ -0,0 +1,31 @@
+.customs-exit-details {
+    &__fieldset {
+        min-width: 100%;
+        border: 1px solid #eee;
+        padding: 20px;
+
+        legend {
+            font-weight: bold;
+            margin-left: 20px;
+        }
+    }
+
+    &__info {
+        font-size: 12px;
+        line-height: 18px;
+        color: #999;
+        border: 1px solid #eee;
+        padding: 15px;
+        margin-bottom: 20px;
+    }
+
+    &__steps {
+        margin-bottom: 20px;
+
+        .el-step__title {
+            font-size: 12px;
+            line-height: normal;
+            padding: 5px;
+        }
+    }
+}

+ 105 - 0
src/packages/pc/views/customs/exit/components/details/index.vue

@@ -0,0 +1,105 @@
+<!-- 交易服务-出境检测-详情 -->
+<template>
+    <app-drawer class="customs-exit-details" title="详情" :width="960" v-model:show="show">
+        <el-steps class="customs-exit-details__steps" :active="selectedRow.gzcjstatus" finish-status="success"
+            align-center>
+            <el-step v-for="item in gzcjStatusList" :title="item.label" :key="item.value" />
+        </el-steps>
+        <div class="customs-exit-details__info">
+            <p>*若货物由广州钻石交易中心经快递发送,快递员揽件时即视为委托方已收货,广州钻石交易中心不承担后续货物安全责任。</p>
+            <p>本表将作为委托方委托广州钻石交易中心办理出境检测业务申请使用,敬请务必如实填写公司信息、货物资料,并盖章确认。广州钻石交易中心根据此表确认信息,作为接受委托办理该批货物出境检测业务的凭证,仅对数量负责。</p>
+        </div>
+        <el-descriptions title="委托方信息" :column="2" border>
+            <el-descriptions-item width="100" label="单据编号">{{ selectedRow.orderid }}</el-descriptions-item>
+            <el-descriptions-item label="送检账户" v-if="selectedRow.gzcjaccounttype === 1">{{ selectedRow.gzcjaccount
+            }}</el-descriptions-item>
+            <el-descriptions-item label="公司名称(中文)">{{ selectedRow.companynamecn }}</el-descriptions-item>
+            <el-descriptions-item label="公司名称(英文)">{{ selectedRow.companynameen }}</el-descriptions-item>
+            <el-descriptions-item label="地址(中文)">{{ selectedRow.addresscn }}</el-descriptions-item>
+            <el-descriptions-item label="地址(英文)">{{ selectedRow.addressen }}</el-descriptions-item>
+            <el-descriptions-item label="联系人姓名">{{ selectedRow.contactname }}</el-descriptions-item>
+            <el-descriptions-item label="联系人职位">{{ selectedRow.contactposition }}</el-descriptions-item>
+            <el-descriptions-item label="联系人电话">{{ selectedRow.contactphoneno }}</el-descriptions-item>
+            <el-descriptions-item label="邮箱">{{ selectedRow.email }}</el-descriptions-item>
+            <el-descriptions-item label="货物品类">{{ selectedRow.gzcjcategorytypedisplay }}</el-descriptions-item>
+            <el-descriptions-item label="成品钻石加工国">{{ selectedRow.processingcountry }}</el-descriptions-item>
+            <el-descriptions-item label="天然钻石毛坯原产地">{{ selectedRow.origincountry }}</el-descriptions-item>
+            <el-descriptions-item label="完成检测后收货方式">{{ selectedRow.gzcjdeliverytypedisplay }}</el-descriptions-item>
+        </el-descriptions>
+        <h3>批次信息</h3>
+        <app-table :data="detailList" :columns="columns" :show-header="false" border>
+            <!-- 刻印服务(证书号/ 其他/ 无) -->
+            <template #gzcjmarktype="{ value }">
+                {{ getGZCJMarkTypeName(value) }}
+            </template>
+        </app-table>
+    </app-drawer>
+</template>
+
+<script lang="ts" setup>
+import { shallowRef, PropType, computed } from 'vue'
+import { useLoginStore } from '@/stores'
+import { queryGZCJJCOrderDetail } from '@/services/api/customs'
+import { getGZCJMarkTypeName, getGZCJStatusList } from '@/constants/customs'
+import AppDrawer from '@pc/components/base/drawer/index.vue'
+import AppTable from '@pc/components/base/table/index.vue'
+
+const props = defineProps({
+    selectedRow: {
+        type: Object as PropType<Ermcp.GZCJJCOrderRsp>,
+        required: true
+    },
+})
+
+const { getUserId } = useLoginStore()
+const show = shallowRef(true)
+const detailList = shallowRef<Ermcp.GZCJJCOrderDetailRsp[]>([])
+
+const gzcjStatusList = getGZCJStatusList().filter((e) => {
+    return ![21, 22, 23].includes(e.value)
+})
+
+const columns = computed<Ermcp.TableColumn[]>(() => {
+    switch (props.selectedRow.gzcjaccounttype) {
+        case 1: {
+            return [
+                { prop: 'gzno', label: '货物编号', show: true },
+                { prop: 'gzcjshapetypestring', label: '形状', width: 200, show: true },
+                { prop: 'weight', label: '重量ct', show: true },
+                { prop: 'amount', label: '参考货值USD', show: true },
+                { prop: 'colorinfo', label: '彩钻信息', show: true },
+                { prop: 'remark', label: '其他', show: true },
+            ]
+        }
+        case 2: {
+            return [
+                { prop: 'gzno', label: '货物编号', show: true },
+                { prop: 'gzcjshapetypestring', label: '形状', width: 200, show: true },
+                { prop: 'weight', label: '重量ct', show: true },
+                { prop: 'amount', label: '参考货值USD', show: true },
+                { prop: 'gzcjmarktype', label: '刻印服务(证书号/ 其他/ 无)', width: 220, show: true },
+                { prop: 'gzcjpublishtypestring', label: '是否披露处理', show: true },
+                { prop: 'gzcjservicetypestring', label: '服务类别', show: true },
+                { prop: 'OriginCertNo', label: '原证书号', show: true },
+                { prop: 'colorinfo', label: '彩钻信息', show: true },
+                { prop: 'remark', label: '其他', show: true },
+            ]
+        }
+    }
+    return []
+})
+
+queryGZCJJCOrderDetail({
+    data: {
+        userid: getUserId(),
+        orderid: props.selectedRow.orderid
+    },
+    success: (res) => {
+        detailList.value = res.data
+    }
+})
+</script>
+
+<style lang="less">
+@import './index.less';
+</style>

+ 30 - 0
src/packages/pc/views/customs/exit/components/download/index.vue

@@ -0,0 +1,30 @@
+<!-- 交易服务-出境检测-文件下载 -->
+<template>
+    <app-drawer title="提示" :width="800" v-model:show="show">
+        <app-table :data="dataList" :loading="loading" :columns="columns" :show-header="false" border>
+            <!-- 操作 -->
+            <template #operate>
+                <el-button size="small">下载</el-button>
+            </template>
+        </app-table>
+    </app-drawer>
+</template>
+
+<script lang="ts" setup>
+import { shallowRef, PropType } from 'vue'
+import { useGZCJBSOrderFileList } from '@/business/customs/bonded'
+import AppDrawer from '@pc/components/base/drawer/index.vue'
+import AppTable from '@pc/components/base/table/index.vue'
+
+const props = defineProps({
+    selectedRow: {
+        type: Object as PropType<Ermcp.GZCJJCOrderRsp | Ermcp.GZBSFWOrderRsp>,
+        required: true
+    },
+})
+
+const { loading, dataList, columns, getGZCJBSOrderFileList } = useGZCJBSOrderFileList(props.selectedRow.orderid)
+const show = shallowRef(true)
+
+getGZCJBSOrderFileList()
+</script>

+ 2 - 2
src/packages/pc/views/customs/exit/components/edit/index.vue

@@ -110,7 +110,7 @@ import type { FormInstance, FormRules, } from 'element-plus'
 import { useComponent } from '@/hooks/component'
 import { validateRules } from '@/constants/regex'
 import { getGZCJAccountTypeList, getGZCJCategoryTypeList, getGZCJDeliveryTypeList, getGZCJShapeTypeName, getGZCJPublishTypeName, getGZCJMarkTypeName, getGZCJServiceTypeName } from '@/constants/customs'
-import { useCJJCOrderEdit } from '@/business/customs'
+import { useCJJCOrderApply } from '@/business/customs/exit'
 import AppDrawer from '@pc/components/base/drawer/index.vue'
 import AppTable from '@pc/components/base/table/index.vue'
 
@@ -125,7 +125,7 @@ const componentMap = new Map<string, unknown>([
 ])
 
 const { componentId, openComponent, closeComponent } = useComponent()
-const { loading, formData, formSubmit } = useCJJCOrderEdit(props.selectedRow)
+const { loading, formData, formSubmit } = useCJJCOrderApply(props.selectedRow)
 const show = ref(true)
 const refresh = ref(false)
 const formRef = ref<FormInstance>()

+ 22 - 5
src/packages/pc/views/customs/exit/index.vue

@@ -4,7 +4,7 @@
         <!-- 表格数据 -->
         <app-table :data="dataList" v-model:columns="columns" :loading="loading">
             <template #header>
-                <app-auth-operation :menus="['add']" />
+                <app-auth-operation :menus="['customs_exit_add']" />
             </template>
             <!-- 操作 -->
             <template #operate="{ row }">
@@ -16,22 +16,39 @@
                     @change="getGZCJJCOrderList" />
             </template>
         </app-table>
-        {{ getGZCJStatusList() }}
     </app-view>
 </template>
 
 <script lang="ts" setup>
 import { ElMessage } from 'element-plus'
-import { getGZCJStatusList } from '@/constants/customs'
-import { useCJJCOrder } from '@/business/customs'
+import { GZCJStatus } from '@/constants/customs'
+import { useCJJCOrderList } from '@/business/customs/exit'
 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'
 
-const { loading, dataList, columns, total, pageIndex, pageSize, getGZCJJCOrderList } = useCJJCOrder()
+const { loading, dataList, columns, total, pageIndex, pageSize, getGZCJJCOrderList } = useCJJCOrderList()
 
 const handleOperateButtons = (row: Ermcp.GZCJJCOrderRsp) => {
     switch (row.gzcjstatus) {
+        case GZCJStatus.Uncommitted: {
+            return ['customs_exit_details', 'customs_exit_edit', 'customs_exit_cancel']
+        }
+        case GZCJStatus.Audit: {
+            return ['customs_exit_details', 'customs_exit_cancel']
+        }
+        case GZCJStatus.Shipping: {
+            return ['customs_exit_details', 'customs_exit_download', 'customs_exit_delivery']
+        }
+        case GZCJStatus.CheckConfirm: {
+            return ['customs_exit_check']
+        }
+        case GZCJStatus.AdvancePaymentConfirm: {
+            return ['customs_exit_advance_payment']
+        }
+        case GZCJStatus.PaymentConfirm: {
+            return ['customs_exit_payment']
+        }
         default: {
             return null
         }

+ 28 - 0
src/packages/pc/views/report/member/index.vue

@@ -0,0 +1,28 @@
+<!-- 报表-会员报表 -->
+<template>
+    <app-view>
+        <!-- 表格数据 -->
+        <app-table :data="dataList" v-model:columns="columns" :loading="loading">
+            <template #header>
+                <app-auth-operation :menus="['customs_exit_add']" />
+            </template>
+            <!-- 操作 -->
+            <template #operate="{ row }">
+                <app-auth-operation :options="{ selectedRow: row }" @closed="getGZCJJCOrderList" />
+            </template>
+            <template #footer>
+                <app-pagination :total="total" v-model:page-size="pageSize" v-model:page-index="pageIndex"
+                    @change="getGZCJJCOrderList" />
+            </template>
+        </app-table>
+    </app-view>
+</template>
+
+<script lang="ts" setup>
+import { useCJJCOrderList } from '@/business/customs/exit'
+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'
+
+const { loading, dataList, columns, total, pageIndex, pageSize, getGZCJJCOrderList } = useCJJCOrderList()
+</script>

+ 28 - 0
src/packages/pc/views/report/trade/index.vue

@@ -0,0 +1,28 @@
+<!-- 报表-交易报表 -->
+<template>
+    <app-view>
+        <!-- 表格数据 -->
+        <app-table :data="dataList" v-model:columns="columns" :loading="loading">
+            <template #header>
+                <app-auth-operation :menus="['customs_exit_add']" />
+            </template>
+            <!-- 操作 -->
+            <template #operate="{ row }">
+                <app-auth-operation :options="{ selectedRow: row }" @closed="getGZCJJCOrderList" />
+            </template>
+            <template #footer>
+                <app-pagination :total="total" v-model:page-size="pageSize" v-model:page-index="pageIndex"
+                    @change="getGZCJJCOrderList" />
+            </template>
+        </app-table>
+    </app-view>
+</template>
+
+<script lang="ts" setup>
+import { useCJJCOrderList } from '@/business/customs/exit'
+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'
+
+const { loading, dataList, columns, total, pageIndex, pageSize, getGZCJJCOrderList } = useCJJCOrderList()
+</script>

+ 28 - 0
src/packages/pc/views/report/warehousing/index.vue

@@ -0,0 +1,28 @@
+<!-- 报表-仓储报表 -->
+<template>
+    <app-view>
+        <!-- 表格数据 -->
+        <app-table :data="dataList" v-model:columns="columns" :loading="loading">
+            <template #header>
+                <app-auth-operation :menus="['customs_exit_add']" />
+            </template>
+            <!-- 操作 -->
+            <template #operate="{ row }">
+                <app-auth-operation :options="{ selectedRow: row }" @closed="getGZCJJCOrderList" />
+            </template>
+            <template #footer>
+                <app-pagination :total="total" v-model:page-size="pageSize" v-model:page-index="pageIndex"
+                    @change="getGZCJJCOrderList" />
+            </template>
+        </app-table>
+    </app-view>
+</template>
+
+<script lang="ts" setup>
+import { useCJJCOrderList } from '@/business/customs/exit'
+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'
+
+const { loading, dataList, columns, total, pageIndex, pageSize, getGZCJJCOrderList } = useCJJCOrderList()
+</script>

+ 2 - 2
src/services/api/customs/index.ts

@@ -50,14 +50,14 @@ export function queryGZCJBSOrderFile(params: HttpParams<{ req: Ermcp.GZCJBSOrder
  * 出境检测申请
  */
 export function cjjcApply(params: TradeParams<Partial<Proto.CJJCApplyReq>, Proto.CJJCApplyRsp>) {
-    return tradeServerRequest('CJJCApplyReq', 'CJJCApplyRsp', params, Market.GZ);
+    return tradeServerRequest('CJJCApplyReq', 'CJJCApplyRsp', params, 66201);
 }
 
 /**
  * 出境检测会员操作
  */
 export function cjjcMemberOperate(params: TradeParams<Proto.CJJCMemberOperateReq, Proto.CJJCMemberOperateRsp>) {
-    return tradeServerRequest('CJJCMemberOperateReq', 'CJJCMemberOperateRsp', params);
+    return tradeServerRequest('CJJCMemberOperateReq', 'CJJCMemberOperateRsp', params, Market.GZ);
 }
 
 /**

+ 2 - 1
src/services/socket/trade/index.ts

@@ -12,12 +12,13 @@ import socket from '../index'
  * 构建消息头部
  */
 function getProtoHeader(funCode: keyof typeof FunCode, header?: IMessageHead, marketId?: number) {
-    const { getUserId } = useLoginStore();
+    const { getUserId, getFirstAccountId } = useLoginStore();
     // 组合请求头
     const protoHeader: IMessageHead = {
         FunCode: FunCode[funCode],
         UUID: v4(),
         UserID: getUserId(),
+        AccountID: getFirstAccountId(),
         ...(header ?? {})
     }
     if (marketId) {

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

@@ -17,7 +17,7 @@ interface StoreState {
     allEnums: ShallowRef<Ermcp.EnumRsp[]>;
 }
 
-const enumKeys = ['ZSCategory', 'ZSCurrencyType', 'ZSCurrencyType', 'ZSColorType', 'ZSClarityType', 'ZSCutType', 'ZSShapeType', 'ZSSymmetryType', 'ZSPolishType', 'ZSFluorescenceType', 'ZSCertType', 'ZSCrystalType', 'ZSCZColor1Type', 'ZSCZColor2Type', 'ZSCZColor3Type', 'ZSStyleType', 'signstatus', 'applystatus', 'executetype', 'certificatetype', 'clientType', 'wrApplyStatus', 'performanceStatus', 'stepStatus', 'GZCJAccountType', 'GZCJCategoryType', 'GZCJDeliveryType', 'GZCJShapeType', 'GZCJMarkType', 'GZCJPublishType', 'GZCJServiceType', 'GZCJStatus'] as const
+const enumKeys = ['ZSCategory', 'ZSCurrencyType', 'ZSCurrencyType', 'ZSColorType', 'ZSClarityType', 'ZSCutType', 'ZSShapeType', 'ZSSymmetryType', 'ZSPolishType', 'ZSFluorescenceType', 'ZSCertType', 'ZSCrystalType', 'ZSCZColor1Type', 'ZSCZColor2Type', 'ZSCZColor3Type', 'ZSStyleType', 'signstatus', 'applystatus', 'executetype', 'certificatetype', 'clientType', 'wrApplyStatus', 'performanceStatus', 'stepStatus', 'GZCJAccountType', 'GZCJCategoryType', 'GZCJDeliveryType', 'GZCJShapeType', 'GZCJMarkType', 'GZCJPublishType', 'GZCJServiceType', 'GZCJStatus', 'GZBSStatus'] as const
 
 /**
  * 枚举存储类

+ 1 - 1
src/types/proto/customs.d.ts

@@ -72,7 +72,7 @@ declare global {
             OperateAccount: string; // 操作人账户,LoginAccount的LoginCode,LoginCode为空则填LoginID,必
             OrderID: number; // 单据ID,必填
             OperateType: number; // 操作类型,必填,1:撤回2:确认发货3:确认检测结果
-            Remark: string; // 备注
+            Remark?: string; // 备注
             ClientType: number; // 终端类型
             ClientSerialNo: string; // 客户端流水号
         }