li.shaoyi před 2 roky
rodič
revize
293910e7ac
26 změnil soubory, kde provedl 518 přidání a 82 odebrání
  1. 2 1
      src/business/login/index.ts
  2. 1 1
      src/business/table/columns.ts
  3. 14 0
      src/mock/router.ts
  4. 2 2
      src/packages/pc/views/auth/login/index.vue
  5. 1 1
      src/packages/pc/views/bargain/sell/index.vue
  6. 12 1
      src/packages/pc/views/centralize/list/index.vue
  7. 2 7
      src/packages/pc/views/centralize/mine/components/add/index.vue
  8. 1 1
      src/packages/pc/views/centralize/mine/components/add/price-edit.vue
  9. 101 0
      src/packages/pc/views/centralize/mine/components/apply/details.vue
  10. 62 0
      src/packages/pc/views/centralize/mine/components/apply/index.vue
  11. 69 15
      src/packages/pc/views/centralize/mine/components/details/index.vue
  12. 1 1
      src/packages/pc/views/centralize/mine/index.vue
  13. 87 0
      src/packages/pc/views/centralize/partake/components/details/index.vue
  14. 11 1
      src/packages/pc/views/centralize/partake/index.vue
  15. 23 17
      src/packages/pc/views/customs/exit/components/details/index.vue
  16. 4 4
      src/packages/pc/views/customs/exit/components/edit/index.vue
  17. 7 2
      src/packages/pc/views/mine/profile/index.vue
  18. 5 0
      src/packages/pc/views/presale/list/index.vue
  19. 1 6
      src/packages/pc/views/presale/mine/components/add/index.vue
  20. 48 8
      src/packages/pc/views/presale/partake/components/details/index.vue
  21. 10 0
      src/packages/pc/views/presale/partake/index.vue
  22. 1 1
      src/packages/pc/views/search/jewelry/index.vue
  23. 24 7
      src/packages/pc/views/trade/buy/components/delisting/index.vue
  24. 20 3
      src/packages/pc/views/warehousing/goods/index.vue
  25. 6 3
      src/types/ermcp/account.d.ts
  26. 3 0
      src/types/ermcp/presale.d.ts

+ 2 - 1
src/business/login/index.ts

@@ -4,7 +4,7 @@ import { encryptAES, decryptAES } from '@/utils/crypto'
 import { timerTask } from '@/utils/timer'
 import { queryLoginId, login } from '@/services/api/account'
 import { sessionData, localData } from '@/stores/storage'
-import { loginStore, enumStore, errorInfoStore, favoriteStore, accountStore, performanceStore } from '@/stores'
+import { loginStore, enumStore, errorInfoStore, favoriteStore, accountStore, performanceStore, exrateStore } from '@/stores'
 import { checkToken, checkTokenLoop } from '@/business/common'
 import service from '@/services'
 import socket from '@/services/socket'
@@ -40,6 +40,7 @@ export function useLogin() {
         performanceStore.actions.getPerformanceStepTypeList()
         accountStore.actions.getAccountList()
         favoriteStore.actions.getFavoriteList()
+        exrateStore.actions.getExrateList()
         checkTokenLoop()
     }
 

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

@@ -36,7 +36,7 @@ export const pcTableColumnMap = new Map<TableColumnKey, Ermcp.TableColumn[]>([
         { prop: 'price', label: '价格' },
         { prop: 'weight', label: '克拉重量' },
         { prop: 'priceper', label: '克拉单价' },
-        { prop: 'marketflag', label: '是否上架' },
+        { prop: 'marketflag', label: '状态' },
         { prop: 'operate', label: '操作' }
     ]],
     // 我的仓储-我的仓库

+ 14 - 0
src/mock/router.ts

@@ -350,6 +350,14 @@ const appmenu = {
                         url: '',
                         urlType: 1,
                         component: 'views/centralize/list/index.vue',
+                        children: [
+                            {
+                                authType: 3,
+                                title: '采购下单',
+                                code: 'centralize_list_details',
+                                component: 'views/centralize/list/components/details/index.vue',
+                            },
+                        ]
                     },
                     {
                         authType: 1,
@@ -1063,6 +1071,12 @@ const appmenu = {
                         children: [
                             {
                                 authType: 3,
+                                title: '详情',
+                                code: 'bargain_sell_details',
+                                component: 'views/warehousing/goods/components/details/index.vue',
+                            },
+                            {
+                                authType: 3,
                                 title: '同意',
                                 code: 'bargain_sell_agree',
                                 component: 'views/bargain/sell/components/audit/index.vue',

+ 2 - 2
src/packages/pc/views/auth/login/index.vue

@@ -40,10 +40,10 @@ const remember = shallowRef(true) // 记住账号
 
 const formRules: FormRules = {
   LoginID: [
-    { required: true, max: 20, message: '随便输入', trigger: 'blur' }
+    { required: true, max: 20, message: '请输入登录账号', trigger: 'blur' }
   ],
   LoginPWD: [
-    { required: true, max: 16, message: '随便输入', trigger: 'blur' }
+    { required: true, max: 16, message: '请输入登录密码', trigger: 'blur' }
   ]
 }
 

+ 1 - 1
src/packages/pc/views/bargain/sell/index.vue

@@ -48,7 +48,7 @@ const handleOperateButtons = (row: Ermcp.MyDelistingApplyRsp) => {
     if (row.applystatus === ApplyStatus.Pending) {
         return ['bargain_sell_agree', 'bargain_sell_refuse']
     }
-    return []
+    return ['bargain_sell_details']
 }
 
 const onSearch = (clear = false) => {

+ 12 - 1
src/packages/pc/views/centralize/list/index.vue

@@ -1,4 +1,4 @@
-<!-- 集采大厅 -->
+<!-- 集采交易 -->
 <template>
     <app-view>
         <template #header>
@@ -10,6 +10,15 @@
             <template #buyqty="{ row }">
                 {{ row.minbuyqty }} / {{ row.maxbuyqty }}
             </template>
+            <!-- 采购保证金(%) -->
+            <template #buymarginvalue="{ value }">
+                {{ parsePercent(value) }}
+            </template>
+            <!-- 操作 -->
+            <template #operate="{ row }">
+                <app-auth-operation type="dropdown" :menus="['centralize_list_details']" :options="{ selectedRow: row }"
+                    @closed="onRefresh" />
+            </template>
             <template #footer>
                 <app-pagination :total="total" v-model:page-size="pageSize" v-model:page-index="pageIndex"
                     @change="onRefresh" />
@@ -21,12 +30,14 @@
 <script lang="ts" setup>
 import { shallowRef } from 'vue'
 import { ElMessage } from 'element-plus'
+import { parsePercent } from '@/filters'
 import { useDataFilter } from '@/hooks/datatable'
 import { useRequest } from '@/hooks/request'
 import { queryGZPreSell } from '@/services/api/presale'
 import AppTable from '@pc/components/base/table/index.vue'
 import AppPagination from '@pc/components/base/pagination/index.vue'
 import AppFilter from '@pc/components/base/table-filter/index.vue'
+import AppAuthOperation from '@pc/components/modules/auth-operation/index.vue'
 
 const { filterOptons, getQueryParams } = useDataFilter<Ermcp.GZPreSellReq>()
 const { loading, dataList, total, pageIndex, pageSize, run } = useRequest(queryGZPreSell, {

+ 2 - 7
src/packages/pc/views/centralize/mine/components/add/index.vue

@@ -1,4 +1,4 @@
-<!-- 预售大厅-我的集采-集采申请 -->
+<!-- 集采交易-我的集采-集采申请 -->
 <template>
     <app-drawer class="g-details" title="集采申请" v-model:show="show" :width="960" :loading="loading" :refresh="refresh">
         <h3 class="g-details__title">集采信息</h3>
@@ -43,7 +43,7 @@
             </el-form-item>
             <el-form-item label="集采日期" prop="PreDate">
                 <el-date-picker type="daterange" placeholder="请选择" range-separator="至" start-placeholder="开始"
-                    end-placeholder="结束" v-model="datePickerValue" :disabled-date="disabledDate" />
+                    end-placeholder="结束" v-model="datePickerValue" />
             </el-form-item>
             <el-form-item class="el-form-item--row" label="集采价格" prop="GZCenterPurchasePriceLists">
                 <app-table :data="formData.GZCenterPurchasePriceLists" :columns="columns" :max-height="400" border>
@@ -194,11 +194,6 @@ const formRules: FormRules = {
     }],
 }
 
-// 只能选择今天开始日期
-const disabledDate = (date: Date) => {
-    return date.getTime() < Date.now() - 24 * 3600 * 1000
-}
-
 // 打开价格编辑
 const openEdit = (row?: Proto.GZCenterPurchasePrice) => {
     selectedRow.value = row

+ 1 - 1
src/packages/pc/views/centralize/mine/components/add/price-edit.vue

@@ -1,4 +1,4 @@
-<!-- 预售大厅-我的集采-集采申请-价格编辑 -->
+<!-- 集采交易-我的集采-集采申请-价格编辑 -->
 <template>
     <app-drawer title="编辑" :width="400" v-model:show="show">
         <el-form ref="formRef" label-width="60px" :model="formItem" :rules="formRules">

+ 101 - 0
src/packages/pc/views/centralize/mine/components/apply/details.vue

@@ -0,0 +1,101 @@
+<!-- 预售大厅-我的预售-我的申请-详情 -->
+<template>
+    <app-drawer title="详情" :width="800" v-model:show="show">
+        <app-table-details title="预售信息" :label-width="140" :data="selectedRow" :cell-props="details1" :column="2">
+            <!-- 采购保证金比例 -->
+            <template #buymarginvalue="{ value }">
+                {{ parsePercent(value) }}
+            </template>
+            <!-- 状态 -->
+            <template #applystatus="{ value }">
+                {{ getInOutApplyStatusName(value) }}
+            </template>
+            <!-- 履约方式 -->
+            <template #performancetemplateid="{ value }">
+                <app-performance-rule :item="getPerformanceTemplateById(value)" />
+            </template>
+        </app-table-details>
+        <app-table-details title="钻石参考信息" :label-width="140" :data="selectedRow" :cell-props="details2" :column="2">
+            <!-- 生产方式 -->
+            <template #ysproductionmode="{ value }">
+                {{ getYSProductionModeName(value) }}
+            </template>
+            <!-- 图片 -->
+            <template #pictureurls>
+                <template v-for="(url, index) in imageUrl" :key="index">
+                    <el-image :src="url" :preview-src-list="imageUrl" fit="cover" />
+                </template>
+            </template>
+        </app-table-details>
+    </app-drawer>
+</template>
+
+<script lang="ts" setup>
+import { shallowRef, reactive, PropType, onMounted } from 'vue'
+import { getFileUrl, parsePercent } from '@/filters'
+import { getInOutApplyStatusName, getYSProductionModeName } from '@/constants/presale'
+import { performanceStore } from '@/stores'
+import AppDrawer from '@pc/components/base/drawer/index.vue'
+import AppTableDetails from '@pc/components/base/table-details/index.vue'
+import AppPerformanceRule from '@pc/components/modules/performance-rule/index.vue'
+
+const props = defineProps({
+    selectedRow: {
+        type: Object as PropType<Ermcp.GZWrPreSaleApplyRsp>,
+        required: true
+    },
+})
+
+const { getPerformanceTemplateById } = performanceStore.actions
+const show = shallowRef(true)
+const imageUrl = reactive<string[]>([])
+
+const details1 = [
+    { prop: 'wrstandardname', label: '商品名称:' },
+    { prop: 'applytime', label: '申请日期:' },
+    { prop: 'presaleqty', label: '预售总量:' },
+    { prop: 'unitprice', label: '预售价格:' },
+    { prop: 'minbuyqty', label: '最小采购单位:' },
+    { prop: 'minsuccessqty', label: '最低成团量:' },
+    { prop: 'maxbuyqty', label: '最大采购单位:' },
+    { prop: 'buymarginvalue', label: '采购保证金比例:' },
+    { prop: 'startdate', label: '开始日期:' },
+    { prop: 'enddate', label: '结束日期:' },
+    { prop: 'applystatus', label: '状态:' },
+    { prop: 'auditremark', label: '审核备注:' },
+    { prop: 'performancetemplateid', label: '履约方式:', entireRow: true },
+]
+
+const details2 = [
+    { prop: 'zscolortypestr', label: '颜色:' },
+    { prop: 'sizestr', label: '尺寸:' },
+    { prop: 'zsclaritytypestr', label: '净度:' },
+    { prop: 'yieldrate', label: '成品率:' },
+    { prop: 'qtydesc', label: '数量描述:' },
+    { prop: 'weightdesc', label: '重量描述:' },
+    { prop: 'ysproductionmode', label: '生产方式:' },
+    { prop: 'pictureurls', label: '图片:', entireRow: true },
+    { prop: 'remark', label: '备注:', entireRow: true },
+]
+
+onMounted(() => {
+    const images = props.selectedRow.pictureurls.split(',')
+    images.forEach((url) => {
+        if (url) {
+            imageUrl.push(getFileUrl(url))
+        }
+    })
+})
+</script>
+
+<style lang="less" scoped>
+.el-image {
+    width: 64px;
+    height: 64px;
+    border: 1px solid #ccc;
+
+    +.el-image {
+        margin-left: 10px;
+    }
+}
+</style>

+ 62 - 0
src/packages/pc/views/centralize/mine/components/apply/index.vue

@@ -0,0 +1,62 @@
+<!-- 集采交易-我的集采-我的申请 -->
+<template>
+    <app-drawer title="我的申请" :width="960" v-model:show="show">
+        <app-table :data="dataList" :columns="columns" :show-toolbar="false" :loading="loading" border>
+            <!-- 状态 -->
+            <template #applystatus="{ value }">
+                {{ getInOutApplyStatusName(value) }}
+            </template>
+            <!-- 操作 -->
+            <template #operate="{ row }">
+                <el-button size="small" @click="openDetails(row)">查看</el-button>
+            </template>
+            <template #footer>
+                <app-pagination :total="total" v-model:page-size="pageSize" v-model:page-index="pageIndex" @change="run" />
+            </template>
+        </app-table>
+        <component :is="Details" v-bind="{ selectedRow }" @closed="showDetails = false" v-if="showDetails" />
+    </app-drawer>
+</template>
+
+<script lang="ts" setup>
+import { shallowRef, defineAsyncComponent } from 'vue'
+import { ElMessage } from 'element-plus'
+import { getInOutApplyStatusName } from '@/constants/presale'
+import { useRequest } from '@/hooks/request'
+import { queryGZWrPreSaleApply } from '@/services/api/presale'
+import AppDrawer from '@pc/components/base/drawer/index.vue'
+import AppTable from '@pc/components/base/table/index.vue'
+import AppPagination from '@pc/components/base/pagination/index.vue'
+
+// 申请详情
+const Details = defineAsyncComponent(() => import('./details.vue'))
+
+const show = shallowRef(true)
+const showDetails = shallowRef(false)
+const selectedRow = shallowRef<Ermcp.GZWrPreSaleApplyRsp>() // 当前选择的申请明细
+
+const { loading, dataList, total, pageIndex, pageSize, run } = useRequest(queryGZWrPreSaleApply, {
+    params: {
+        pagesize: 10,
+        marketid: 62201,
+    },
+    onError: (err) => {
+        ElMessage.error(err)
+    }
+})
+
+const columns: Ermcp.TableColumn[] = [
+    { prop: 'wrstandardname', label: '商品' },
+    { prop: 'presaleqty', label: '集采数量(克拉)' },
+    { prop: 'startdate', label: '开始日期' },
+    { prop: 'enddate', label: '结束日期' },
+    { prop: 'applystatus', label: '状态' },
+    { prop: 'applytime', label: '申请时间' },
+    { prop: 'operate', label: '操作', fixed: 'right' },
+]
+
+const openDetails = (item: Ermcp.GZWrPreSaleApplyRsp) => {
+    selectedRow.value = item
+    showDetails.value = true
+}
+</script>

+ 69 - 15
src/packages/pc/views/centralize/mine/components/details/index.vue

@@ -1,11 +1,35 @@
-<!-- 预售大厅-我的预售-详情 -->
+<!-- 集采交易-我的集采-详情 -->
 <template>
     <app-drawer class="g-details" title="详情" :width="960" v-model:show="show">
-        <app-table-details title="预售信息" :label-width="100" :data="selectedRow" :cell-props="details1" :column="2" />
-        <app-table-details title="钻石参考信息" :label-width="100" :data="selectedRow" :cell-props="details2" :column="2" />
+        <app-table-details title="预售信息" :label-width="140" :data="selectedRow" :cell-props="details1" :column="2">
+            <!-- 采购保证金比例 -->
+            <template #buymarginvalue="{ value }">
+                {{ parsePercent(value) }}
+            </template>
+            <!-- 状态 -->
+            <template #presalestatus="{ value }">
+                {{ getWRPresaleStatusName(value) }}
+            </template>
+            <!-- 履约方式 -->
+            <template #performancetemplateid="{ value }">
+                <app-performance-rule :item="getPerformanceTemplateById(value)" />
+            </template>
+        </app-table-details>
+        <app-table-details title="钻石参考信息" :label-width="140" :data="selectedRow" :cell-props="details2" :column="2">
+            <!-- 生产方式 -->
+            <template #ysproductionmode="{ value }">
+                {{ getYSProductionModeName(value) }}
+            </template>
+            <!-- 图片 -->
+            <template #pictureurls>
+                <template v-for="(url, index) in imageUrl" :key="index">
+                    <el-image :src="url" :preview-src-list="imageUrl" fit="cover" />
+                </template>
+            </template>
+        </app-table-details>
         <app-table :data="dataList" :columns="columns" :show-toolbar="false" :loading="loading" border>
             <template #header>
-                <h3 class="g-details__title">认购信息</h3>
+                <h3 class="g-details__title">购信息</h3>
             </template>
             <template #footer>
                 <app-pagination :total="total" v-model:page-size="pageSize" v-model:page-index="pageIndex" @change="run" />
@@ -15,14 +39,18 @@
 </template>
 
 <script lang="ts" setup>
-import { shallowRef, PropType } from 'vue'
+import { shallowRef, reactive, PropType, onMounted } from 'vue'
 import { ElMessage } from 'element-plus'
+import { getFileUrl, parsePercent } from '@/filters'
+import { getWRPresaleStatusName, getYSProductionModeName } from '@/constants/presale'
 import { useRequest } from '@/hooks/request'
+import { performanceStore } from '@/stores'
 import { queryGZMyPresell } from '@/services/api/presale'
 import AppDrawer from '@pc/components/base/drawer/index.vue'
 import AppTable from '@pc/components/base/table/index.vue'
 import AppPagination from '@pc/components/base/pagination/index.vue'
 import AppTableDetails from '@pc/components/base/table-details/index.vue'
+import AppPerformanceRule from '@pc/components/modules/performance-rule/index.vue'
 
 const props = defineProps({
     selectedRow: {
@@ -31,7 +59,10 @@ const props = defineProps({
     },
 })
 
+const { getPerformanceTemplateById } = performanceStore.actions
 const show = shallowRef(true)
+const imageUrl = reactive<string[]>([])
+
 const { loading, dataList, total, pageIndex, pageSize, run } = useRequest(queryGZMyPresell, {
     params: {
         pagesize: 10,
@@ -44,9 +75,9 @@ const { loading, dataList, total, pageIndex, pageSize, run } = useRequest(queryG
 
 const details1 = [
     { prop: 'wrstandardname', label: '商品名称:' },
-    { prop: 'createtime', label: '申请日期:' },
-    { prop: 'presaleqty', label: '预售总量:' },
-    { prop: 'unitprice', label: '预售价格:' },
+    { prop: 'customername', label: '卖方:' },
+    { prop: 'presaleqty', label: '集采总量:' },
+    { prop: 'yszscategory', label: '钻石类型:' },
     { prop: 'minbuyqty', label: '最小采购单位:' },
     { prop: 'minsuccessqty', label: '最低成团量:' },
     { prop: 'maxbuyqty', label: '最大采购单位:' },
@@ -54,8 +85,9 @@ const details1 = [
     { prop: 'startdate', label: '开始日期:' },
     { prop: 'enddate', label: '结束日期:' },
     { prop: 'presalestatus', label: '状态:' },
-    { prop: 'tradeqty', label: '已认购数量:' },
-    { prop: 'performancetemplateid', label: '履约方式:' },
+    { prop: 'tradeqty', label: '已采购数量:' },
+    { prop: 'performancetemplateid', label: '履约方式:', entireRow: true },
+    { prop: 'price', label: '集采价格:', entireRow: true },
 ]
 
 const details2 = [
@@ -66,13 +98,35 @@ const details2 = [
     { prop: 'qtydesc', label: '数量描述:' },
     { prop: 'weightdesc', label: '重量描述:' },
     { prop: 'ysproductionmode', label: '生产方式:' },
-    { prop: 'pictureurls', label: '图片:' },
-    { prop: 'remark', label: '备注:' },
+    { prop: 'pictureurls', label: '图片:', entireRow: true },
+    { prop: 'remark', label: '备注:', entireRow: true },
 ]
 
 const columns: Ermcp.TableColumn[] = [
-    { prop: 'customername', label: '购方' },
+    { prop: 'customername', label: '购方' },
     { prop: 'orderqty', label: '认购数量(ct)' },
-    { prop: 'ordertime', label: '认购时间' },
+    { prop: 'tradeprice', label: '采购价格(元/克拉)' },
+    { prop: 'ordertime', label: '采购时间' },
 ]
-</script>
+
+onMounted(() => {
+    const images = props.selectedRow.pictureurls.split(',')
+    images.forEach((url) => {
+        if (url) {
+            imageUrl.push(getFileUrl(url))
+        }
+    })
+})
+</script>
+
+<style lang="less" scoped>
+.el-image {
+    width: 64px;
+    height: 64px;
+    border: 1px solid #ccc;
+
+    +.el-image {
+        margin-left: 10px;
+    }
+}
+</style>

+ 1 - 1
src/packages/pc/views/centralize/mine/index.vue

@@ -1,4 +1,4 @@
-<!-- 集采大厅-我的集采 -->
+<!-- 集采交易-我的集采 -->
 <template>
     <app-view>
         <template #header>

+ 87 - 0
src/packages/pc/views/centralize/partake/components/details/index.vue

@@ -0,0 +1,87 @@
+<!-- 集采交易-我参与的预售-详情 -->
+<template>
+    <app-drawer title="详情" :width="960" v-model:show="show">
+        <app-table-details title="集采信息" :label-width="100" :data="selectedRow" :cell-props="details1" :column="2">
+            <!-- 采购保证金比例 -->
+            <template #marginvalue="{ value }">
+                {{ parsePercent(value) }}
+            </template>
+        </app-table-details>
+        <app-table-details title="钻石参考信息" :label-width="100" :data="selectedRow" :cell-props="details2" :column="2">
+            <!-- 生产方式 -->
+            <template #ysproductionmode="{ value }">
+                {{ getYSProductionModeName(value) }}
+            </template>
+            <!-- 图片 -->
+            <template #pictureurls>
+                <template v-for="(url, index) in imageUrl" :key="index">
+                    <el-image :src="url" :preview-src-list="imageUrl" fit="cover" />
+                </template>
+            </template>
+        </app-table-details>
+    </app-drawer>
+</template>
+
+<script lang="ts" setup>
+import { shallowRef, reactive, PropType, onMounted } from 'vue'
+import { getFileUrl, parsePercent } from '@/filters'
+import { getYSProductionModeName } from '@/constants/presale'
+import AppDrawer from '@pc/components/base/drawer/index.vue'
+import AppTableDetails from '@pc/components/base/table-details/index.vue'
+
+const props = defineProps({
+    selectedRow: {
+        type: Object as PropType<Ermcp.GZMyTradingPreSellRsp>,
+        required: true
+    },
+})
+
+const show = shallowRef(true)
+const imageUrl = reactive<string[]>([])
+
+const details1 = [
+    { prop: 'wrstandardname', label: '商品名称:' },
+    { prop: 'customername', label: '卖方:' },
+    { prop: 'orderqty', label: '采购数量:' },
+    { prop: 'yszscategory', label: '钻石类型:' },
+    { prop: 'tradeprice', label: '采购价格:' },
+    { prop: 'tradeamount', label: '货款:' },
+    { prop: 'marginvalue', label: '保证金比例:' },
+    { prop: 'freezemargin', label: '保证金:' },
+    { prop: 'ordertime', label: '采购时间:' },
+    { prop: 'performancetemplateid', label: '履约方式:', entireRow: true },
+]
+
+const details2 = [
+    { prop: 'zscolortypestr', label: '颜色:' },
+    { prop: 'sizestr', label: '尺寸:' },
+    { prop: 'zsclaritytypestr', label: '净度:' },
+    { prop: 'yieldrate', label: '成品率:' },
+    { prop: 'qtydesc', label: '数量描述:' },
+    { prop: 'weightdesc', label: '重量描述:' },
+    { prop: 'ysproductionmode', label: '生产方式:' },
+    { prop: 'pictureurls', label: '图片:', entireRow: true },
+    { prop: 'remark', label: '备注:', entireRow: true },
+]
+
+onMounted(() => {
+    const images = props.selectedRow.pictureurls.split(',')
+    images.forEach((url) => {
+        if (url) {
+            imageUrl.push(getFileUrl(url))
+        }
+    })
+})
+</script>
+
+<style lang="less" scoped>
+.el-image {
+    width: 64px;
+    height: 64px;
+    border: 1px solid #ccc;
+
+    +.el-image {
+        margin-left: 10px;
+    }
+}
+</style>

+ 11 - 1
src/packages/pc/views/centralize/partake/index.vue

@@ -1,4 +1,4 @@
-<!-- 集采大厅-我参与的集采 -->
+<!-- 集采交易-我参与的集采 -->
 <template>
     <app-view>
         <template #header>
@@ -6,6 +6,14 @@
         </template>
         <!-- 表格数据 -->
         <app-table :data="dataList" v-model:columns="tableColumns" :loading="loading">
+            <!-- 采购保证金(%) -->
+            <template #marginvalue="{ value }">
+                {{ parsePercent(value) }}
+            </template>
+            <!-- 状态 -->
+            <template #status="{ value }">
+                {{ getWRPresaleStatusName(value) }}
+            </template>
             <!-- 操作 -->
             <template #operate="{ row }">
                 <app-auth-operation type="dropdown" :menus="['presale_partake_details']" :options="{ selectedRow: row }"
@@ -22,8 +30,10 @@
 <script lang="ts" setup>
 import { shallowRef } from 'vue'
 import { ElMessage } from 'element-plus'
+import { parsePercent } from '@/filters'
 import { useDataFilter } from '@/hooks/datatable'
 import { useRequest } from '@/hooks/request'
+import { getWRPresaleStatusName } from '@/constants/presale'
 import { queryGZMyTradingPreSell } from '@/services/api/presale'
 import AppTable from '@pc/components/base/table/index.vue'
 import AppPagination from '@pc/components/base/pagination/index.vue'

+ 23 - 17
src/packages/pc/views/customs/exit/components/details/index.vue

@@ -1,8 +1,7 @@
 <!-- 交易服务-出境检测-详情 -->
 <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-steps class="customs-exit-details__steps" :active="stepActive" 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">
@@ -10,22 +9,23 @@
             <p>本表将作为委托方委托广州钻石交易中心办理出境检测业务申请使用,敬请务必如实填写公司信息、货物资料,并盖章确认。广州钻石交易中心根据此表确认信息,作为接受委托办理该批货物出境检测业务的凭证,仅对数量负责。</p>
         </div>
         <el-descriptions title="委托方信息" :column="2" border>
-            <el-descriptions-item width="100" label="单据编号">{{ selectedRow.orderidstr }}</el-descriptions-item>
-            <el-descriptions-item label="送检账户" v-if="selectedRow.gzcjaccounttype === 1">{{
+            <el-descriptions-item width="120" label="单据编号">{{ selectedRow.orderidstr }}</el-descriptions-item>
+            <el-descriptions-item width="120" 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.zsorigin }}</el-descriptions-item>
-            <el-descriptions-item label="完成检测后收货方式">{{ selectedRow.gzcjdeliverytypedisplay }}</el-descriptions-item>
+            <el-descriptions-item width="120" label="公司名称(中文)">{{ selectedRow.companynamecn }}</el-descriptions-item>
+            <el-descriptions-item width="120" label="公司名称(英文)">{{ selectedRow.companynameen }}</el-descriptions-item>
+            <el-descriptions-item width="120" label="地址(中文)">{{ selectedRow.addresscn }}</el-descriptions-item>
+            <el-descriptions-item width="120" label="地址(英文)">{{ selectedRow.addressen }}</el-descriptions-item>
+            <el-descriptions-item width="120" label="联系人姓名">{{ selectedRow.contactname }}</el-descriptions-item>
+            <el-descriptions-item width="120" label="联系人职位">{{ selectedRow.contactposition }}</el-descriptions-item>
+            <el-descriptions-item width="120" label="联系人电话">{{ selectedRow.contactphoneno }}</el-descriptions-item>
+            <el-descriptions-item width="120" label="邮箱">{{ selectedRow.email }}</el-descriptions-item>
+            <el-descriptions-item width="120" label="货物品类">{{ selectedRow.gzcjcategorytypedisplay }}</el-descriptions-item>
+            <el-descriptions-item width="120" label="成品钻石加工国">{{ selectedRow.processingcountry }}</el-descriptions-item>
+            <el-descriptions-item width="120" label="天然钻石毛坯原产地">{{ selectedRow.zsorigin }}</el-descriptions-item>
+            <el-descriptions-item width="120" label="完成检测后收货方式">{{ selectedRow.gzcjdeliverytypedisplay
+            }}</el-descriptions-item>
         </el-descriptions>
         <h3 class="el-descriptions__header">
             <span class="el-descriptions__title">批次信息</span>
@@ -57,9 +57,15 @@ const { loading, detailList, columns, getGZCJJCOrderDetailList } = useGZCJJCOrde
 const show = shallowRef(true)
 
 const gzcjStatusList = getGZCJStatusList().filter((e) => {
-    return ![21, 22, 23].includes(e.value)
+    const status = [21, 22, 23] // 审核拒绝、未提交、已撤销 只显示单个状态
+    if (status.includes(props.selectedRow.gzcjstatus)) {
+        return e.value === props.selectedRow.gzcjstatus
+    }
+    return !status.includes(e.value)
 })
 
+const stepActive = gzcjStatusList.findIndex((e) => e.value === props.selectedRow.gzcjstatus)
+
 getGZCJJCOrderDetailList()
 </script>
 

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

@@ -44,8 +44,8 @@
             </el-form-item>
             <el-form-item label="货物品类" prop="GZCJCategoryType">
                 <el-select v-model="formData.GZCJCategoryType">
-                    <el-option :label="item.label" :value="item.value"
-                        v-for="(item, index) in getGZCJCategoryTypeList()" :key="index" />
+                    <el-option :label="item.label" :value="item.value" v-for="(item, index) in getGZCJCategoryTypeList()"
+                        :key="index" />
                 </el-select>
             </el-form-item>
             <el-form-item label="成品钻石加工国" prop="ProcessingCountry">
@@ -56,8 +56,8 @@
             </el-form-item>
             <el-form-item label="完成检测后收货方式" prop="GZCJDeliveryType">
                 <el-select v-model="formData.GZCJDeliveryType">
-                    <el-option :label="item.label" :value="item.value"
-                        v-for="(item, index) in getGZCJDeliveryTypeList()" :key="index" />
+                    <el-option :label="item.label" :value="item.value" v-for="(item, index) in getGZCJDeliveryTypeList()"
+                        :key="index" />
                 </el-select>
             </el-form-item>
         </el-form>

+ 7 - 2
src/packages/pc/views/mine/profile/index.vue

@@ -9,7 +9,7 @@
             <el-descriptions-item label="机构代码">{{ userInfo.userid }}</el-descriptions-item>
             <el-descriptions-item label="法人姓名">{{ handleNoneValue(userInfo.legalpersonname) }}</el-descriptions-item>
             <el-descriptions-item label="证件类型">{{ getCertificateTypeName(userInfo.cardtypeid) }}</el-descriptions-item>
-            <el-descriptions-item label="企业地址">{{ handleNoneValue(userInfo.address) }}</el-descriptions-item>
+            <el-descriptions-item label="企业地址">{{ userAddress }}</el-descriptions-item>
             <el-descriptions-item label="证件号码">{{ handleNoneValue(decryptAES(userInfo.cardnum)) }}
             </el-descriptions-item>
             <el-descriptions-item label="联系人">{{ handleNoneValue(userInfo.contactname) }}</el-descriptions-item>
@@ -27,7 +27,7 @@
                 <el-descriptions-item label="开户银行">{{ bankInfo.bankname }}</el-descriptions-item>
                 <el-descriptions-item label="证件类型">{{
                     bankInfo.cardtype ?
-                        getCertificateTypeName(Number(bankInfo.cardtype)) : handleNoneValue('')
+                    getCertificateTypeName(Number(bankInfo.cardtype)) : handleNoneValue('')
                 }}
                 </el-descriptions-item>
                 <el-descriptions-item label="银行卡户名">{{ bankInfo.bankaccountname }}</el-descriptions-item>
@@ -78,5 +78,10 @@ const handleTableButtons = computed(() => {
     return buttons
 })
 
+const userAddress = computed(() => {
+    const address = [userInfo.province, userInfo.city, userInfo.district, userInfo.address].join(' ')
+    return handleNoneValue(address)
+})
+
 getBankAccountSign()
 </script>

+ 5 - 0
src/packages/pc/views/presale/list/index.vue

@@ -10,6 +10,10 @@
             <template #buyqty="{ row }">
                 {{ row.minbuyqty }} / {{ row.maxbuyqty }}
             </template>
+            <!-- 采购保证金(%) -->
+            <template #buymarginvalue="{ value }">
+                {{ parsePercent(value) }}
+            </template>
             <!-- 操作 -->
             <template #operate="{ row }">
                 <app-auth-operation type="dropdown" :menus="['presale_list_details']" :options="{ selectedRow: row }"
@@ -26,6 +30,7 @@
 <script lang="ts" setup>
 import { shallowRef } from 'vue'
 import { ElMessage } from 'element-plus'
+import { parsePercent } from '@/filters'
 import { useDataFilter } from '@/hooks/datatable'
 import { useRequest } from '@/hooks/request'
 import { queryGZPreSell } from '@/services/api/presale'

+ 1 - 6
src/packages/pc/views/presale/mine/components/add/index.vue

@@ -41,7 +41,7 @@
             </el-form-item>
             <el-form-item label="预售日期" prop="PreDate">
                 <el-date-picker type="daterange" placeholder="请选择" range-separator="至" start-placeholder="开始"
-                    end-placeholder="结束" v-model="datePickerValue" :disabled-date="disabledDate" />
+                    end-placeholder="结束" v-model="datePickerValue" />
             </el-form-item>
         </el-form>
         <h3 class="g-details__title">钻石参考信息</h3>
@@ -152,11 +152,6 @@ const formRules: FormRules = {
     }],
 }
 
-// 只能选择今天开始日期
-const disabledDate = (date: Date) => {
-    return date.getTime() < Date.now() - 24 * 3600 * 1000
-}
-
 const onUploadChange = (files: { filePath: string }[]) => {
     formData.PictureUrls = files.map((e) => e.filePath).join(',')
 }

+ 48 - 8
src/packages/pc/views/presale/partake/components/details/index.vue

@@ -1,17 +1,35 @@
 <!-- 预售大厅-我参与的预售-详情 -->
 <template>
     <app-drawer title="详情" :width="960" v-model:show="show">
-        <app-table-details title="预售信息" :label-width="100" :data="selectedRow" :cell-props="details1" :column="2" />
-        <app-table-details title="钻石参考信息" :label-width="100" :data="selectedRow" :cell-props="details2" :column="2" />
+        <app-table-details title="预售信息" :label-width="100" :data="selectedRow" :cell-props="details1" :column="2">
+            <!-- 采购保证金比例 -->
+            <template #marginvalue="{ value }">
+                {{ parsePercent(value) }}
+            </template>
+        </app-table-details>
+        <app-table-details title="钻石参考信息" :label-width="100" :data="selectedRow" :cell-props="details2" :column="2">
+            <!-- 生产方式 -->
+            <template #ysproductionmode="{ value }">
+                {{ getYSProductionModeName(value) }}
+            </template>
+            <!-- 图片 -->
+            <template #pictureurls>
+                <template v-for="(url, index) in imageUrl" :key="index">
+                    <el-image :src="url" :preview-src-list="imageUrl" fit="cover" />
+                </template>
+            </template>
+        </app-table-details>
     </app-drawer>
 </template>
 
 <script lang="ts" setup>
-import { shallowRef, PropType } from 'vue'
+import { shallowRef, reactive, PropType, onMounted } from 'vue'
+import { getFileUrl, parsePercent } from '@/filters'
+import { getYSProductionModeName } from '@/constants/presale'
 import AppDrawer from '@pc/components/base/drawer/index.vue'
 import AppTableDetails from '@pc/components/base/table-details/index.vue'
 
-defineProps({
+const props = defineProps({
     selectedRow: {
         type: Object as PropType<Ermcp.GZMyTradingPreSellRsp>,
         required: true
@@ -19,6 +37,7 @@ defineProps({
 })
 
 const show = shallowRef(true)
+const imageUrl = reactive<string[]>([])
 
 const details1 = [
     { prop: 'wrstandardname', label: '商品名称:' },
@@ -29,7 +48,7 @@ const details1 = [
     { prop: 'marginvalue', label: '保证金比例:' },
     { prop: 'freezemargin', label: '保证金:' },
     { prop: 'ordertime', label: '认购时间:' },
-    { prop: 'performancetemplateid', label: '履约方式:' },
+    { prop: 'performancetemplateid', label: '履约方式:', entireRow: true },
 ]
 
 const details2 = [
@@ -40,7 +59,28 @@ const details2 = [
     { prop: 'qtydesc', label: '数量描述:' },
     { prop: 'weightdesc', label: '重量描述:' },
     { prop: 'ysproductionmode', label: '生产方式:' },
-    { prop: 'pictureurls', label: '图片:' },
-    { prop: 'remark', label: '备注:' },
+    { prop: 'pictureurls', label: '图片:', entireRow: true },
+    { prop: 'remark', label: '备注:', entireRow: true },
 ]
-</script>
+
+onMounted(() => {
+    const images = props.selectedRow.pictureurls.split(',')
+    images.forEach((url) => {
+        if (url) {
+            imageUrl.push(getFileUrl(url))
+        }
+    })
+})
+</script>
+
+<style lang="less" scoped>
+.el-image {
+    width: 64px;
+    height: 64px;
+    border: 1px solid #ccc;
+
+    +.el-image {
+        margin-left: 10px;
+    }
+}
+</style>

+ 10 - 0
src/packages/pc/views/presale/partake/index.vue

@@ -6,6 +6,14 @@
         </template>
         <!-- 表格数据 -->
         <app-table :data="dataList" v-model:columns="tableColumns" :loading="loading">
+            <!-- 采购保证金(%) -->
+            <template #marginvalue="{ value }">
+                {{ parsePercent(value) }}
+            </template>
+            <!-- 状态 -->
+            <template #status="{ value }">
+                {{ getWRPresaleStatusName(value) }}
+            </template>
             <!-- 操作 -->
             <template #operate="{ row }">
                 <app-auth-operation type="dropdown" :menus="['presale_partake_details']" :options="{ selectedRow: row }"
@@ -22,8 +30,10 @@
 <script lang="ts" setup>
 import { shallowRef } from 'vue'
 import { ElMessage } from 'element-plus'
+import { parsePercent } from '@/filters'
 import { useDataFilter } from '@/hooks/datatable'
 import { useRequest } from '@/hooks/request'
+import { getWRPresaleStatusName } from '@/constants/presale'
 import { queryGZMyTradingPreSell } from '@/services/api/presale'
 import AppTable from '@pc/components/base/table/index.vue'
 import AppPagination from '@pc/components/base/pagination/index.vue'

+ 1 - 1
src/packages/pc/views/search/jewelry/index.vue

@@ -100,7 +100,7 @@ const componentMap = new Map<string, unknown>([
     ['compare', defineAsyncComponent(() => import('./components/compare/index.vue'))], // 对比
 ])
 
-const { componentId, openComponent, closeComponent } = useComponent()
+const { componentId, openComponent, closeComponent } = useComponent(() => getSellOrderList())
 const { loading, dataList, checkedItems, formData, enums, selectItem, getSellOrderList, onSearch, onReset } = useSearch(Category.Jewelry)
 const selectedRow = ref<Ermcp.SellOrderSearchRsp>() // 当前选中的数据项
 const formRef = ref<FormInstance>()

+ 24 - 7
src/packages/pc/views/trade/buy/components/delisting/index.vue

@@ -6,7 +6,7 @@
                 <span>我的钻石</span>
             </div>
         </template>
-        <app-table :data="dataList" :columns="columns" :show-toolbar="false" selection-type="single" border
+        <app-table ref="tableRef" :data="dataList" :columns="columns" :show-toolbar="false" selection-type="single" border
             @select="onTableSelect">
             <!-- 价格 -->
             <template #price="{ row }">
@@ -18,13 +18,17 @@
             </template>
         </app-table>
         <el-form ref="formRef" label-width="80px" :model="formData" :rules="formRules" v-if="dataList.length">
-            <el-form-item label="价格(¥)" prop="ApplyPrice">
+            <el-form-item :label="priceLable" prop="ApplyPrice">
                 <div class="el-form-item--col">
                     <el-input type="number" placeholder="请输入" v-model="formData.ApplyPrice" />
-                    <span style="white-space:nowrap;"
-                        v-if="selectedGoods && selectedGoods.zscurrencytype !== CurrencyType.CNY">汇率:{{
-                            getExrate(selectedGoods.zscurrencytype)
-                        }}</span>
+                    <template v-if="selectedGoods && selectedGoods.zscurrencytype !== CurrencyType.CNY">
+                        <span style="white-space:nowrap;">
+                            汇率:{{ getExrate(selectedGoods.zscurrencytype) }}
+                        </span>
+                        <span style="white-space:nowrap;" v-if="formData.ApplyPrice">
+                            折合:{{ (formData.ApplyPrice * getExrate(selectedGoods.zscurrencytype)).toFixed(2) }}
+                        </span>
+                    </template>
                 </div>
             </el-form-item>
             <el-form-item label="备注" prop="ApplyRemark">
@@ -38,7 +42,7 @@
 </template>
 
 <script lang="ts" setup>
-import { ref, PropType } from 'vue'
+import { ref, PropType, computed } from 'vue'
 import Long from 'long'
 import { ElMessage } from 'element-plus'
 import type { FormInstance, FormRules } from 'element-plus'
@@ -59,11 +63,21 @@ const { getExrate } = exrateStore.actions
 const { loading, dataList, columns, formData, formSubmit, getDiamondList } = useSellOrderBargain(props.selectedRow)
 const selectedGoods = ref<Ermcp.MyWRPositionRsp>() // 当前选中的商品
 const formRef = ref<FormInstance>()
+const tableRef = ref()
 
 const formRules: FormRules = {
     ApplyPrice: [{ required: true, message: '请输入价格', trigger: 'blur' }],
 }
 
+const priceLable = computed(() => {
+    const { zscurrencytypedisplayunit } = selectedGoods.value ?? {}
+    let label = '价格'
+    if (zscurrencytypedisplayunit) {
+        label += `(${zscurrencytypedisplayunit})`
+    }
+    return label
+})
+
 // 勾选表格行
 const onTableSelect = (rows: Ermcp.MyWRPositionRsp[]) => {
     const row = rows[0]
@@ -85,6 +99,9 @@ const onSubmit = () => {
             if (formData.WRStandardID) {
                 formSubmit().then(() => {
                     ElMessage.success('提交成功')
+                    formData.ApplyPrice = undefined
+                    formData.ApplyRemark = undefined
+                    tableRef.value?.elTable.clearSelection() // 清空所选商品
                     getDiamondList()
                 }).catch((err) => {
                     ElMessage.error('提交失败:' + err)

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

@@ -27,7 +27,7 @@
             </template>
             <!-- 是否下架 -->
             <template #marketflag="{ value }">
-                {{ value === 1 ? '是' : '否' }}
+                {{ getGoodsStatusName(value) }}
             </template>
             <!-- 操作 -->
             <template #operate="{ row }">
@@ -59,10 +59,14 @@ const { tableColumns } = useComposeTable<Ermcp.MyWRPositionRsp>({ rowKey: 'goods
 const { filterOptons, getQueryParams } = useDataFilter<Ermcp.MyWRPositionReq>()
 
 const handleOperateButtons = (row: Ermcp.MyWRPositionRsp) => {
+    const buttons = ['warehousing_goods_details']
     if (row.marketflag === 1) {
-        return ['warehousing_goods_details', 'warehousing_goods_pull']
+        buttons.push('warehousing_goods_pull')
     }
-    return ['warehousing_goods_details', 'warehousing_goods_put', 'warehousing_goods_delete']
+    if (row.marketflag === 2) {
+        buttons.push('warehousing_goods_put', 'warehousing_goods_delete')
+    }
+    return buttons
 }
 
 const onSearch = (clear = false) => {
@@ -78,6 +82,19 @@ const onRefresh = () => {
     })
 }
 
+// 获取商品状态
+const getGoodsStatusName = (status: number) => {
+    switch (status) {
+        case 1:
+            return '已上架'
+        case 2:
+            return '未上架'
+        case 3:
+            return '履约中'
+    }
+    return '--'
+}
+
 filterOptons.selectList = [
     {
         label: '商品分类',

+ 6 - 3
src/types/ermcp/account.d.ts

@@ -231,14 +231,16 @@ declare global {
             cardfrontphotourl: string;//证件正面图片地址
             cardnum: string;//证件号码(加密存储)
             cardtypeid: number;//证件类型ID
-            cityid: number;//市
+            city: string; // 市
+            cityid: number;// 市ID
             company: string;//公司(个人)
             contactname: string;//联系人
             countryid: number;//国家
             createtime: string;//创建时间
             creatorid: number;//创建人
             customername: string;//客户名称(企业名称)
-            districtid: number;//地区
+            district: string; // 地区
+            districtid: number;// 地区ID
             email: string;//邮件(加密存储)
             fax: string;//传真(加密存储)
             halfbodyphotourl: string;//半身照地址
@@ -256,7 +258,8 @@ declare global {
             openmode: number;//开户方式 - 1:管理端开户 2:网上开户注册(会员官网) 3:微信开户 4:网页交易端注册 5:安卓手机端注册 6:苹果手机端注册 7:PC交易端注册 8:微信快速开户 9:支付宝快速开户 10:手机号快速开户
             otherurl: string;//其它图片地址[使用分号分隔]
             postalcode: string;//邮政编码
-            provinceid: number;//省
+            province: string; // 省
+            provinceid: number;// 省ID
             qq: string;//QQ(加密存储
             remark: string;//备注
             sex: number;//用户性别 0: 女 1: 男

+ 3 - 0
src/types/ermcp/presale.d.ts

@@ -161,6 +161,7 @@ declare namespace Ermcp {
 
     /** 我参与的预售(预售中\执行中)\我参与的集采(集采中\执行中) 列表查询 响应 */
     interface GZMyTradingPreSellRsp {
+        bannerpicurl: string; // Banner图(逗号分隔)
         customername: string; // 企业名称(预售方、卖方)
         freezemargin: number; // 冻结保证金\已付保证金
         marginalgorithm: number; // 保证金方式 - 1:比率 2:固定
@@ -169,11 +170,13 @@ declare namespace Ermcp {
         ordertime: string; // 委托时间(认购时间)
         performanceplanid: number; // 履约计划ID/合同ID
         performancetemplateid: number; // 履约计划模板ID
+        pictureurls: string; // 详情图片(逗号分隔)
         presaleapplyid: string; // 预售申请ID(184+Unix秒时间戳(10位)+xxxxxx)
         qtydesc: string; // 数量描述 [2:毛坯钻石]
         remark: string; // 备注
         sizestr: string; // 尺寸 [1:成品裸钻 \ 2:毛坯钻石]
         status: number; // 状态 1:预售中\集采中 2:执行中 3:已完成
+        thumurls: string; // 缩略图片(1:1)(逗号分隔)
         tradeamount: number; // 货款
         tradeprice: number; // 成交价格\认购价格 - [摘牌] (浮动价 ((商品1价格商品1价格系数+升贴水) 商品1重量系数 + 商品2价格商品2价格系数+商品2升贴水) 商品2重量系数 …)* 委托单价格系数 + 委托单升贴水)
         weightdesc: string; // 重量描述 [2:毛坯钻石]