Selaa lähdekoodia

:rocket:feat: 一些页面

Ritchie 1 vuosi sitten
vanhempi
commit
a96d0f04e2

BIN
src/assets/accountOperation/userManageIcon.png


+ 29 - 16
src/router/index.js

@@ -140,28 +140,14 @@ const router = createRouter({
       component: () => import("@/views/taskMessage/index"),
       meta: { index: 1 },
     },
-    // 挂单匹配通知
+    // 挂单匹配通知,废弃x
     {
       path: "/orderMatchNotice",
       name: "orderMatchNotice",
       component: () => import("@/views/msgNotice/OrderMatchNotice.vue"),
       meta: { index: 1 },
     },
-    // 挂单匹配列表页
-    {
-      path: "/pendingOrderList",
-      name: "pendingOrderList",
-      component: () => import("@views/taskMessage/pendingOrderList.vue"),
-      meta: { index: 1 }
-    },
-    // 挂单匹配页
-    {
-      path: "/pendingOrder",
-      name: "pendingOrder",
-      component: () => import("@views/taskMessage/pendingOrder.vue"),
-      meta: { index: 1 }
-    },
-    // 成交通知
+    // 成交通知,废弃x
     {
       path: "/closingNotice",
       name: "closingNotice",
@@ -182,6 +168,33 @@ const router = createRouter({
       component: () => import("@/views/taskMessage/TaskAccount.vue"),
       meta: { index: 1 },
     },
+    // 用户管理列表
+    {
+      path: "/userManageList",
+      name: "userManageList",
+      component: () => import("@/views/taskMessage/UserManageList.vue"),
+      meta: { index: 1 }
+    },
+    {
+      path: "/userManage",
+      name: "userManage",
+      component: () => import("@/views/taskMessage/UserManage.vue"),
+      meta: { index: 1 }
+    },
+    // 挂单匹配列表页
+    {
+      path: "/pendingOrderList",
+      name: "pendingOrderList",
+      component: () => import("@/views/taskMessage/PendingOrderList.vue"),
+      meta: { index: 1 }
+    },
+    // 挂单匹配页
+    {
+      path: "/pendingOrder",
+      name: "pendingOrder",
+      component: () => import("@/views/taskMessage/PendingOrder.vue"),
+      meta: { index: 1 }
+    },
     // 账户操作
     {
       path: "/accountOperation",

+ 7 - 1
src/service/buyOrSell/index.js

@@ -1,6 +1,12 @@
 import axios from '@/utils/axios';
 
 // 获取买入确定列表
-export function getUnconfirmedTradeOrderList() {
+export function getBuyConfList() {
     return axios.get(`/myCenter/unconfirmedTradeOrder/buy`);
+}
+
+
+// 买家上传支付凭证
+export function uploadImg() {
+    return axios.post(`/myCenter/uploadCertificateImg`);
 }

+ 10 - 12
src/service/merchantManage/index.js

@@ -1,12 +1,3 @@
-// 获取商户列表
-// /tAdmin/pageAdmin
-// 获取账户基本详情
-// /tAdmin/getAdmin
-// 获取账户详情-提现信息
-// /tJoinpayMch/getMch
-// 修改账户信息
-// /tAdmin/updateAdmin
-
 import axios from '../../utils/axios';
 import { stringToUrl } from '@/common/js/utils';
 
@@ -36,10 +27,16 @@ export function getAdminMch(params) {
   return axios.get(`/SZWL-SERVER/tJoinpayMch/getMch?${stringToUrl(params)}`);
 }
 // 修改账户信息
+// export function updateAdmin(params) {
+//   // tAdmin/update
+//   return axios.post(`/SZWL-SERVER/tAdmin/update`, params);
+// }
+
+// 更改 用户关键信息和状态
 export function updateAdmin(params) {
-  // tAdmin/update
-  return axios.post(`/SZWL-SERVER/tAdmin/update`, params);
+  return axios.put(`/userInfo/updateUserInfo`, params);
 }
+
 // 获取汇付信息
 export function getHuifuMch(params) {
   return axios.get(`/SZWL-SERVER/tHuifuMch/getHuifuMchCheck?${stringToUrl(params)}`);
@@ -47,4 +44,5 @@ export function getHuifuMch(params) {
 // 切换登陆
 export function autoLoginMerchant(params) {
   return axios.get(`/SZWL-SERVER/tAdmin/autoLogin?${stringToUrl(params)}`);
-}
+}
+

+ 6 - 0
src/service/msgNotice/index.js

@@ -0,0 +1,6 @@
+import axios from '@/utils/axios';
+
+// 获取所有挂单列表
+export function getPendList() {
+    return axios.get(`/sysInfo/pagePendOrder`);
+}

+ 7 - 0
src/service/pendingOrder/index.js

@@ -0,0 +1,7 @@
+import axios from '@/utils/axios';
+
+// 获取所有挂单列表
+export function getPagePendList() {
+    return axios.get(`/sysInfo/pagePendOrder`);
+}
+

+ 8 - 1
src/service/position/index.js

@@ -1,6 +1,13 @@
 import axios from '../../utils/axios';
 
+// 获取我的持仓情况
+export function getMyStock() {
+    return axios.get(`/myStock/getMyStock`);
+}
+
+
 // 个人挂单历史记录
 export function listMyOrderHis(params) {
     return axios.get(`/myStock/listMyOrderHis`, params);
-}
+}
+

+ 17 - 0
src/service/userManage/index.js

@@ -0,0 +1,17 @@
+import axios from "../../utils/axios";
+
+// 分页查询 用户表
+export function pageUserList(params) {
+  return axios.get(
+    `/userInfo/pageUserInfo`,
+    params
+  );
+}
+
+// 禁止用户交易
+export function banUserOrder(params) {
+  return axios.post(
+    `/userInfo/banUserOrder`,
+    params
+  );
+}

+ 18 - 0
src/stores/trade.js

@@ -0,0 +1,18 @@
+import { defineStore } from 'pinia';
+
+export const useTradeStore = defineStore('trade', {
+  state: () => ({
+    tradeItem: null
+  }),
+  actions: {
+    setTradeItem(item) {
+      this.tradeItem = item;
+    },
+    getTradeItem() {
+      return this.tradeItem;
+    },
+    clearTradeItem() {
+      this.tradeItem = null;
+    }
+  }
+});

+ 176 - 0
src/styles/pendingOrderList/index.less

@@ -0,0 +1,176 @@
+.pendingOrderList {
+    width: 100%;
+  
+    .pendingOrderBox {
+      width: 100%;
+      height: calc(100% - 60px);
+      overflow: auto;
+  
+      // background: #fff url('../../assets/taskMessage/pageBg.png') top center no-repeat;
+      // background-size: 100%;
+      .taskListRow {
+        width: 100%;
+        height: 53px;
+        flex-wrap: wrap;
+  
+        .taskIcon {
+          width: 13%;
+          height: 100%;
+          position: relative;
+  
+          &.deviceIcon::after {
+            content: '';
+            position: absolute;
+            background: #fff url('../../assets/taskMessage/deviceIcon.png') top center no-repeat;
+            background-size: 100%;
+            width: 0.6rem;
+            height: 0.6rem;
+            right: 0.15rem;
+            top: 0.4rem;
+          }
+  
+          &.retailIcon::after {
+            content: '';
+            position: absolute;
+            background: #fff url('../../assets/taskMessage/retailIcon.png') top center no-repeat;
+            background-size: 100%;
+            width: 0.6rem;
+            height: 0.6rem;
+            right: 0.15rem;
+            top: 0.4rem;
+          }
+  
+          &.withIcon::after {
+            content: '';
+            position: absolute;
+            background: #fff url('../../assets/taskMessage/withIcon.png') top center no-repeat;
+            background-size: 100%;
+            width: 0.6rem;
+            height: 0.6rem;
+            right: 0.15rem;
+            top: 0.4rem;
+          }
+        }
+  
+        .taskRight {
+          width: 87%;
+          height: 100%;
+          position: relative;
+          border-bottom: 1px solid #e7eaf7;
+  
+          &::after {
+            content: '';
+            position: absolute;
+            width: 6px;
+            height: 12px;
+            background: url('../../assets/right.png') top center no-repeat;
+            background-size: 100%;
+            right: 0.55rem;
+            top: 0.5rem;
+          }
+  
+          .taskTitle {
+            line-height: 53px;
+          }
+        }
+      }
+  
+      .searchRow {
+        width: 95%;
+        height: 48px;
+        margin: 0 auto;
+        background: rgba(255, 255, 255, 1) url("../../assets/home/line.png") bottom center no-repeat;
+        background-size: 100%;
+        align-items: center;
+  
+        .bd3 {
+          width: 87px;
+          height: 16px;
+  
+          .outer4 {
+            width: 20px;
+            height: 26px;
+            background: url("../../assets/alarmHistory/icon.png") top center no-repeat;
+            background-size: 100%;
+  
+            &.equipmentIcon {
+              background: url("../../assets/taskMessage/deviceIcon.png") top center no-repeat;
+              background-size: 100%;
+            }
+  
+            &.joinPayMchCheckIcon {
+              background: url("../../assets/taskMessage/withIcon.png") top center no-repeat;
+              background-size: 100%;
+            }
+  
+            &.proportionIcon {
+              background: url("../../assets/taskMessage/retailIcon.png") top center no-repeat;
+              background-size: 100%;
+              background-position: center top -2px;  /* 向上移动 2 像素 */
+            }
+          }
+  
+          .txt2 {
+            width: 65px;
+            height: 14px;
+            overflow-wrap: break-word;
+            color: rgba(64, 77, 116, 1);
+            font-size: 15px;
+            font-family: PingFangSC-Semibold;
+            text-align: left;
+            white-space: nowrap;
+            line-height: 15px;
+            display: block;
+            font-weight: bold;
+  
+            .discountNumber {
+              font-size: 18px;
+              color: red;
+            }
+          }
+        }
+  
+        .label3 {
+          color: #4d6add;
+          margin-right: 10px;
+        }
+      }
+  
+      .van-tabs__line {
+        background-color: #4d6add !important;
+      }
+  
+      .van-tab--active .van-tab__text--ellipsis {
+        color: #4d6add;
+      }
+  
+      .listBox {
+        .listItem {
+          width: 100%;
+          background: url("../../assets/home/line.png") bottom center no-repeat;
+          background-size: 100%;
+          position: relative;
+          display: inline-block;
+  
+          .itemBox {
+            width: 92%;
+            margin: 20px auto;
+            font-size: 12px;
+            line-height: 1.64;
+  
+            .itemRow {
+              width: 100%;
+            }
+  
+            .itemTitle {
+              color: #8787a6;
+            }
+  
+            .discount {
+              padding-left: 2em;
+            }
+          }
+        }
+      }
+    }
+  }

+ 12 - 0
src/styles/taskMessage/index.less

@@ -41,6 +41,18 @@
           top: 0.4rem;
         }
 
+        &.userManageIcon::after {
+          content: '';
+          position: absolute;
+          background: #fff url('../../assets/accountOperation/userManageIcon.png') top center no-repeat;
+          background-size: 100%;
+          width: 0.5rem;
+          height: 0.5rem;
+          right: 0.15rem;
+          top: 0.4rem;
+        }
+        
+
         &.orderMatchIcon::after {
           content: '';
           position: absolute;

+ 127 - 9
src/views/buyOrSell/BuyConf.vue

@@ -1,27 +1,141 @@
 <script setup>
-import { ref } from 'vue'
+import { ref, onMounted, onBeforeUnmount } from "vue";
 import sHeader from "@/components/SimpleHeader";
-const value = ref([
-    { url: 'https://fastly.jsdelivr.net/npm/@vant/assets/leaf.jpeg' },
+import { useTradeStore } from '@/stores/trade';
+import { uploadImg } from "@/service/buyOrSell";
+import { showFailToast, showSuccessToast } from "vant";
+import { useRouter } from 'vue-router'
+// const value = ref([
+//     { url: 'https://fastly.jsdelivr.net/npm/@vant/assets/leaf.jpeg' },
+// ]);
+
+const certificate = ref('SsfOS75GxUGjGk') // 买家用户名
+const price = ref(80.02) // 价格
+const tradeNumber = ref(2000) // 股票数量
+// const sellerUserName = ref('')  // 卖家用户名
+const sellerPayeeCode = ref('13045678901') // 卖家支付宝
+const sellerCardNo = ref('642343275134234203470') // 卖家银行卡号
+const totalPrice = ref(0)
+const orderId = ref('') // 交易单id
+
+const tradeStore = useTradeStore()
+const router = useRouter();
+
+const imgFile = ref()
+
+const onSubmit = async () => {
+    const params = {
+        file: imgFile.value,
+        orderId: orderId.value
+    }
+    const { data } = await uploadImg(params)
+    if (data.code === '00000') {
+        showSuccessToast('成功')
+        router.go(-1)
+    } else {
+        showFailToast(data.message)
+    }
+}
+
+
+
+onMounted(() => {
+    if (tradeStore.tradeItem) {
+        orderId.value = tradeStore.tradeItem.id;
+        totalPrice.value = tradeStore.tradeItem.totalPrice;
+        const item = tradeStore.getTradeItem()
+        console.log("item >>>", item);
+        console.log("看看有没有 >>>", tradeStore.tradeItem);
+    }
+});
+
+// 当组件卸载时清除用户信息
+onBeforeUnmount(() => {
+    tradeStore.clearTradeItem();
+});
+
+totalPrice.value = price.value * tradeNumber.value;
+
+
+const fileList = ref([
+    // {
+    //     url: 'https://fastly.jsdelivr.net/npm/@vant/assets/leaf.jpeg',
+    //     status: 'uploading',
+    //     message: '上传中...',
+    // },
+    // {
+    //     url: 'https://fastly.jsdelivr.net/npm/@vant/assets/tree.jpeg',
+    //     status: 'failed',
+    //     message: '上传失败',
+    // },
+    // { url: 'https://cloud-image', isImage: true },
+    {
+        // url: 'https://fastly.jsdelivr.net/npm/@vant/assets/sand.jpeg',
+        url: 'https://fastly.jsdelivr.net/npm/@vant/assets/cat.jpeg',
+        status: 'done',
+        message: '上传完成',
+    }
 ]);
+
+// const afterRead = (file) => {
+//     file.status = 'uploading';
+//     file.message = '上传中...';
+
+//     setTimeout(() => {
+//         file.status = 'failed';
+//         file.message = '上传失败';
+//     }, 2000);
+// };
+
+const afterRead = async (file) => {
+    // 将文件上传至服务器
+    // const { data } = await uploadImg(
+    //     // file,OrderId
+    //   );
+    imgFile.value = file
+    console.log("上传文件", file);
+}
+
 </script>
 
 <template>
     <div class="buyConf">
-        <s-header :name="'交易买入确认'" :noback="false"></s-header>
-        
-        <!-- 买家操作,付款 -->
+        <s-header :name="'买家付款'" :noback="false"></s-header>
+
+        <!-- 提交 -->
         <van-form @submit="onSubmit">
+            <br>
+            <!-- 买入数量/单价/总价 -->
+            <van-cell-group inset>
+                <van-field v-model="certificate" readonly name="单据凭证" label="单据凭证" placeholder="单据凭证"
+                    left-icon="coupon" />
+                <van-field v-model="tradeNumber" readonly name="买入数量" label="买入数量" placeholder="买入数量"
+                    left-icon="goods-collect" :rules="[{ required: true, message: '买入数量不能为空' }]" />
+                <van-field v-model="price" readonly name="买入单价" label="买入单价" placeholder="买入单价" left-icon="gold-coin" />
+                <van-field v-model="totalPrice" readonly name="需付款¥" label="需付款¥" placeholder="需付款¥" left-icon="bill" />
+            </van-cell-group>
+            <br>
+            <!-- 卖家收款信息 -->
+            <van-cell-group inset>
+                <van-field v-model="sellerPayeeCode" readonly name="卖家支付宝号" label="卖家支付宝号" placeholder="卖家支付宝号"
+                    left-icon="alipay" :rules="[{ required: true, message: '支付宝号不能为空' }]" />
+                <van-field v-model="sellerCardNo" readonly name="卖家银行卡号" label="卖家银行卡号" placeholder="卖家银行卡号"
+                    left-icon="card" :rules="[{ required: true, message: '卖家银行卡号不能为空' }]" />
+            </van-cell-group>
+            <br>
+            <!-- 上传支付宝/银行付款截图 -->
             <van-cell-group inset>
                 <van-field name="uploader" label="买家上传付款截图">
                     <template #input>
-                        <van-uploader v-model="value" />
+                        <van-uploader v-model="fileList" :after-read="afterRead" reupload max-count="1">
+                            <van-button icon="plus" color="#39a6fe">上传转账截图</van-button>
+                        </van-uploader>
                     </template>
                 </van-field>
             </van-cell-group>
             <div style="margin: 16px;">
                 <van-button round block type="primary" native-type="submit">
-                    通知卖家
+                    提交
                 </van-button>
             </div>
         </van-form>
@@ -29,4 +143,8 @@ const value = ref([
     </div>
 </template>
 
-<style scoped></style>
+<style scoped>
+.buyConf {
+    background-color: #e3e3e3;
+}
+</style>

+ 196 - 179
src/views/buyOrSell/BuyConfList.vue

@@ -1,189 +1,206 @@
+<script setup>
+import { onMounted, ref, reactive } from "vue";
+import sHeader from "@/components/SimpleHeader";
+import { getBuyConfList } from "@/service/buyOrSell";
+import { showFailToast } from "vant";
+import { getLoginUser, styleUrl } from "@/common/js/utils";
+import dateUtil from "@/utils/dateUtil";
+import { useRouter } from 'vue-router'
+import { useTradeStore } from '@/stores/trade';
+
+const router = useRouter()
+
+const user = getLoginUser();
+const loading = ref(false); // 加载状态
+const error = ref(false); // 错误状态
+const finished = ref(false); // 结束翻页状态
+const buyConfList = ref([]); // 列表集合
+const buyConfTotal = ref(0); // 列表总数
+let searchParams = reactive({
+    current: 1, // 当前页,默认第一页
+    size: 10, // 页大小,默认10条
+});
+
+// 滚动加载
+const onLoad = () => {
+    if (!finished.value) {
+        getList();
+    }
+};
+
+// 查询列表
+const searchGetList = () => {
+    buyConfList.value = [];
+    searchParams.current = 1;
+    getList();
+};
+
+// 获取新人账号注册审批列表数据
+const getList = async () => {
+
+    console.log("你好");
+    const { data } = await getBuyConfList(
+        // Object.assign({}, searchParams)
+    );
+
+    // const { data } = await getBuyConfList();
+    if (data.code === "00000") {
+        console.log("data.data >>>", data.data);
+        // 列表值叠加
+        buyConfList.value = buyConfList.value.concat(
+            data.data.records
+        );
+        buyConfTotal.value = data.data.total;
+        if (buyConfList.value.length === data.data.total) {
+            finished.value = true;
+        }
+        loading.value = false;
+        console.log("buyConfList >>>", buyConfList.value);
+    } else {
+        showFailToast(data.message);
+    }
+};
+
+const showDateTime = (date) => {
+    return date
+        ? dateUtil.formateDate(new Date(date), "yyyy-MM-dd hh:mm:ss")
+        : "";
+};
+
+const showStatusText = (status) => {
+    if (status === '0') {
+        return "未确认";
+    }
+    if (status === '1') {
+        return "已确认";
+    }
+    if (status === '2') {
+        return "特殊取消";
+    }
+    return "未知";
+};
+
+// const userStore = useUserStore();
+const tradeStore = useTradeStore();
+// 去审核账号
+const toBuy = (item) => {
+    // userStore.setUserInfo(item);
+    tradeStore.setTradeItem(item);
+    router.push({ name: 'taskAccount' });
+};
+
+// 是否有操作的权限
+const isOper = ref(true);
+// 初始化页面获取列表
+onMounted(async () => {
+    // 加载样式
+    styleUrl('taskAccountList');
+    if (user) {
+        searchGetList();
+
+        // 如果不是admin账号,不能有操作权限
+        if (user.userName != 'admin') {
+            isOper.value = false;
+        }
+    }
+});
+</script>
+
 <template>
-    <!-- 买家确认列表 -->
-    <div class="buyConfList flex-col">
-        <s-header name="买家确认列表" :noback="false"></s-header>
-
-        <div class="headCon l-flex-between o-plr-20 o-pt-26 o-pb-12 kBordBott">
-            <div class="l-flex-RC">
-                <div class="ruleIcon"></div>
-                <div class="c-text-color c-text-b c-text-15">
-                    共
-                    <span class="c-text-20" style="color: #df5e4c">{{ patchTotal }}</span>
-                    条记录
+    <!-- 买家付款确认列表 -->
+    <div class="taskAccountList flex-col">
+        <s-header name="买家付款确认" :noback="false"></s-header>
+
+        <div class="taskAccountBox flex-col">
+            <van-list v-model:loading="loading" v-model:error="error" :error-text="$t('common.reqFailClkReload')"
+                :finished="finished" :finished-text="$t('common.noMoreTxt')" offset="300" :immediate-check="false"
+                @load="onLoad">
+                <div class="searchRow flex-row justify-between">
+                    <div class="flex-col">
+                        <div class="flex-row justify-between bd3">
+                            <!-- 图标 -->
+                            <!-- <div class="flex-col outer4 proportionIcon"></div> -->
+                            <span class="flex-col txt2">{{ $t("taskMessage.total")
+                                }}<span class="discountNumber">{{ buyConfTotal }}</span>{{
+                                    $t("taskMessage.recordsInTotal") }}</span>
+                        </div>
+                    </div>
+                    <!-- <div class="l-flex-RC"> -->
+                    <!-- <div @click="reviewedClk" class="label3 o-mr-30">
+                        {{ $t("taskMessage.toViewAppro") }}
+                    </div> -->
+                    <!-- </div> -->
                 </div>
-            </div>
-        </div>
-
-        <div class="contentCon">
-            <van-pull-refresh disabled v-model="refreshing" @refresh="onRefresh">
-                <div v-for="(item, index) in tableData" :key="index">
-                    <br />
-                    <van-cell-group inset @click="toSetupAccount(item)">
-                        <van-cell>
-                            <template #title>
-                                <div class="l-flex-RC">
-                                    <span class="c-color c-text-12">姓名:</span>
-                                    <span class="c-text-color c-text-12">{{ item.actualName }}</span>
-                                </div>
-                            </template>
-                            <template #label>
-                                <div class="l-flex-RC">
-                                    <span class="c-color c-text-12">手机号:</span>
-                                    <span class="c-text-color c-text-12">{{ item.phone }}</span>
-                                </div>
-                                <div class="l-flex-RC">
-                                    <span class="c-color c-text-12">支付宝账号:</span>
-                                    <span class="c-text-color c-text-12">{{ item.payeeCode }}</span>
-                                </div>
-                                <div class="l-flex-RC">
-                                    <span class="c-color c-text-12">部门号:</span>
-                                    <span class="c-text-color c-text-12">{{ getDeptName(item.deptId) }}</span>
-                                </div>
-                                <div class="l-flex-RC">
-                                    <span class="c-color c-text-12">申请时间:</span>
-                                    <span class="c-text-color c-text-12">{{ Format_time(item.createTime) }}</span>
-                                </div>
-                                <!-- 确认状态 status:0 未确认...,1 已确认✓ -->
-                                <div class="itemRow" style="display: flex; justify-content: flex-end">
-                                    <span v-if="item.status === '0' && user.type > 1" style="color: #FFA500"> {{
-            $t('taskMessage.toBeApproved') }}</span>
-                                    <span v-if="item.status === '1'" style="color: #1989fa"> {{
-            $t('taskMessage.adopt') }}</span>
-                                    <span v-if="item.status === '2'" style="color: #ff0000"> {{
-                                        $t('taskMessage.fail') }}</span>
-                                </div>
-
-                            </template>
-                            <br />
-
-                        </van-cell>
-                    </van-cell-group>
+                <!-- 买入列表 -->
+                <!-- 卖家用户名sellerUserName,单据凭证certificate,创建时间createTime,买入价格price,状态status -->
+                <div class="listBox">
+                    <div v-for="(item) in buyConfList" :key="item.id" class="listItem">
+                        <div class="itemBox">
+                            <div class="itemRow">
+                                <span class="itemTitle">卖家用户名:&nbsp;</span>{{
+                                    item.sellerUserName }}
+                            </div>
+                            <div class="itemRow">
+                                <span class="itemTitle">单据凭证:&nbsp;</span>{{
+                                    item.certificate }}
+                            </div>
+                            <div class="itemRow">
+                                <span class="itemTitle">创建时间:&nbsp;</span>{{
+                                    item.createTime }}
+                            </div>
+                            <div class="itemRow">
+                                <span class="itemTitle">买入价格:&nbsp;</span>{{
+                                    item.price }}
+                            </div>
+
+                            <!-- 状态,0未确认,1已确认,2特殊取消 -->
+                            <div class="itemRow" v-if="item.status === '0'">
+                                <span class="itemTitle">状态:&nbsp;</span><span style="color: red">{{
+                                    showItemType(item.status)
+                                }}</span>
+                            </div>
+                            <!-- 卖家确认时间 -->
+                            <div class="itemRow" v-if="item.status === '1'">
+                                <span class="itemTitle">卖家确认时间:&nbsp;</span>{{
+                                    showDateTime(item.sellerConfirmTime)
+                                }}
+                            </div>
+                            <!-- 去付款 -->
+                            <div v-if="item.status === '0' && isOper" class="itemRow"
+                                style="display: flex; justify-content: flex-end">
+                                <van-button span="5" round type="primary" :style="{
+                                    height: '2em',
+                                    padding: '0 1.2em',
+                                    margin: '0 1em',
+                                    backgroundColor: 'rgb(200, 55, 95 / 80%)', // 红色背景,不透明度为100%
+                                    color: '#fff', // 文字颜色为白色
+                                    boxShadow: '0 2px 8px rgba(255, 55, 95, 0.3)', // 添加阴影效果
+                                    transition: 'all 0.3s ease' // 添加过渡效果,使变化更平滑
+                                }" @click="toBuy(item)">
+                                    付款
+                                </van-button>
+                            </div>
+                            <div class="itemRow" style="display: flex; justify-content: flex-end">
+                                <!-- 已确认 -->
+                                <span v-if="item.status === '1'" style="color: #4fc08d">{{
+                                    showStatusText(item.status)
+                                    }}</span>
+                                <!-- 特殊取消 -->
+                                <span v-if="item.status === '2'" style="color: #ff0000">{{
+                                    showStatusText(item.status)
+                                    }}</span>
+                            </div>
+                        </div>
+                    </div>
                 </div>
-
-            </van-pull-refresh>
+            </van-list>
         </div>
 
-
     </div>
 </template>
 
-<script>
-import sHeader from "@/components/SimpleHeader";
-import { ref, onMounted, toRefs, reactive } from "vue";
-import { styleUrl } from "../../common/js/utils";
-import { useRouter } from "vue-router";
-import { Format_time } from "@/common/js/utils";
-import { getUnconfirmedTradeOrderList } from "@/service/buyOrSell"
-
-export default {
-    components: { sHeader },
-    setup() {
-
-        onMounted(() => {
-            // 加载样式
-            styleUrl('taskAccount');
-            // onRefresh();
-            getList();
-        });
-
-        // 多少条规则
-        const patchTotal = ref(0);
-        // 分页
-        const pageNo = ref(1);
-        const pageSize = ref(10);
-        let ruleData = reactive({
-            tableData: [],
-        });
-        // 上拉刷新
-        const loading = ref(true);
-        const finished = ref(false);
-
-        // 下拉刷新
-        const onRefresh = (idx) => {
-            ruleData.tableData = [];
-            // 解决请求两次问题
-            if (!idx) {
-                finished.value = false;
-            }
-            loading.value = true;
-            // 初始化分页
-            pageNo.value = 1;
-            pageSize.value = 10;
-            getList();
-            console.log("getList >>>");
-        };
-
-        // 上拉加载
-        const onLoad = () => {
-            pageNo.value++;
-            getList();
-        };
-        // 下拉刷新
-        const refreshing = ref(false);
-        const getList = () => {
-            // let param = {
-            //     current: pageNo.value,
-            //     size: pageSize.value,
-            // };
-
-            // 获取买入确定列表 /myCenter/unconfirmedTradeOrder/buy
-            // const getListFunc = await getUnconfirmedTradeOrderList();
-            const { data } = getUnconfirmedTradeOrderList();
-            if ( data.code === '00000') {
-                console.log("data.code >>>", data.data);
-                console.log("data.data.records >>>", ruleData.tableData.value);
-                ruleData.tableData.value = data.data.records;
-            }
-            
-
-            getUnconfirmedTradeOrderList().then((res) => {
-                const { data } = res.data;
-                refreshing.value = false;
-                ruleData.tableData.push(...data.records);
-                // 加载状态结束
-                loading.value = false;
-                // 总共
-                patchTotal.value = data.total;
-                if (ruleData.tableData.length >= data.total) {
-                    finished.value = true;
-                }
-            });
-        };
-
-
-        // 获取部门名称
-        // const getDeptName = computed(() => {
-        //     const deptId = {
-        //         '0': '研发部',
-        //         '1': '行政部',
-        //     };
-        //     return (item) => deptId[item.deptId] || '';
-        // })
-
-        const router = useRouter();
-
-        const setupAccountObj = ref({});
-        // 点击卡片,跳转确认买入
-        const toBuyConf = (item) => {
-            setupAccountObj.value = item;
-            router.push("/buyConf");
-        }
 
-        return {
-            patchTotal,
-            onRefresh,
-            onLoad,
-            getList,
-            loading,
-            finished,
-            ...toRefs(ruleData),
-            refreshing,
-            // getTargetAreasText,
-            Format_time,
-            toBuyConf
-        };
-    }
-};
-</script>
 
-<style lang="less" scoped></style>
+<style lang="less" scoped>
+@import "../../common/style/common.less";
+</style>

+ 31 - 3
src/views/buyOrSell/SellConf.vue

@@ -1,16 +1,40 @@
 <script setup>
 import sHeader from "@/components/SimpleHeader";
+import { ref } from 'vue'
+
+const certificate = ref('SsfOS75GxUGjGk') // 买家用户名
+const price = ref(80.02) // 价格
+const tradeNumber = ref(2000) // 股票数量
+const totalPrice = ref(0)
+totalPrice.value = price.value * tradeNumber.value;
+
 </script>
 
 <template>
     <div class="sellConf">
-        <s-header :name="'交易确认'" :noback="false"></s-header>
+        <s-header :name="'确认收款'" :noback="false"></s-header>
 
         <!-- 卖家操作 -->
         <van-form @submit="onSubmit">
+            <br>
+            <!-- 买家应付款 -->
+            <van-cell-group inset>
+                <van-field v-model="certificate" readonly name="单据凭证" label="单据凭证" placeholder="单据凭证"
+                    left-icon="coupon" />
+                <van-field v-model="tradeNumber" readonly name="卖出数量" label="卖出数量" placeholder="卖出数量"
+                    left-icon="goods-collect" :rules="[{ required: true, message: '买出数量不能为空' }]" />
+                <van-field v-model="price" readonly name="卖出单价" label="卖出单价" placeholder="卖出单价" left-icon="gold-coin" />
+                <van-field v-model="totalPrice" readonly name="应收款¥" label="应收款¥" placeholder="应收款¥" left-icon="bill" />
+            </van-cell-group>
+
+            <br>
             <van-cell-group inset>
                 <!-- 买家的付款截图 -->
-                <van-image width="100" height="100" src="https://fastly.jsdelivr.net/npm/@vant/assets/cat.jpeg" />
+                <van-field name="uploader" label="买家的付款截图">
+                    <template #input>
+                        <van-image width="100" height="100" src="https://fastly.jsdelivr.net/npm/@vant/assets/cat.jpeg" />
+                    </template>
+                </van-field>
             </van-cell-group>
             <div style="margin: 16px;">
                 <van-button round block type="primary" native-type="submit">
@@ -22,4 +46,8 @@ import sHeader from "@/components/SimpleHeader";
     </div>
 </template>
 
-<style scoped></style>
+<style scoped>
+.sellConf {
+    background-color: #e3e3e3;
+}
+</style>

+ 2 - 0
src/views/login/Register.vue

@@ -118,6 +118,7 @@ export default {
     const jobId = ref('');
     const show = ref(false);
     const deptName = ref('');
+    const jobName = ref('');
     // 选项列表,children 代表子选项,支持多级嵌套
     const options = [
       {
@@ -360,6 +361,7 @@ export default {
       hireDate,
       deptId,
       deptName,
+      jobName,
       jobId,
       show,
       options,

+ 83 - 4
src/views/msgNotice/OrderMatchNotice.vue

@@ -1,15 +1,94 @@
 <script setup>
-// import { ref } from 'vue';
+import { ref } from 'vue';
 import sHeader from "@/components/SimpleHeader";
+
+const getStatusText = (statusValue) => {
+    const statusMap = {
+        0: '过期',
+        1: '生效',
+        2: '撤单',
+        3: '全部成交',
+        4: '部分成交',
+    }
+    return statusMap[statusValue] || '未知状态';
+}
+
+
+const typeTexts = ['未知类型', '买', '卖'];
+const getTypeText = (typeValue) => {
+    return typeTexts[typeValue] || typeTexts[0];
+};
+
+const orderMatchList = ref([
+    {
+        createTime: "2024-04-16",
+        entrustNumber: "2000",
+        price: "80.03",
+        tradeNumber: "1500",
+        type: "1"
+    },
+    {
+        createTime: "2024-04-15",
+        entrustNumber: "3000",
+        price: "81.00",
+        tradeNumber: "2000",
+        type: "2"
+    }
+])
+
 </script>
 
 <template>
+    <!-- 挂单匹配通知列表 -->
     <div class="orderMatchNotice flex-col">
         <div class="orderMatchNoticeBox">
-            <s-header :name="'挂单匹配通知'" :noback="false" :isFixed="false"></s-header>
-            挂单匹配通知
+            <s-header :name="'挂单匹配列表'" :noback="false" :isFixed="false"></s-header>
+            <h3>挂单匹配列表</h3>
+
+            <!-- 列表 -->
+            <div class="listItem" v-for="(item, index) in orderMatchList" :key="index">
+                <br>
+                <van-col span="16" style="font-size: medium;">创建时间: {{ item.createTime }}</van-col>
+                <van-cell-group>
+                    <van-row justify="space-around" class="row-col">
+                        <van-col span="8">委托数量: {{ item.entrustNumber }}</van-col>
+                        <van-col span="8">成交数量: {{ item.tradeNumber }}</van-col>
+                        <van-col span="8">挂单价格: {{ item.price }}</van-col>
+                        <!-- 状态:0过期,1生效,2撤单,3全部成交,4部分成交 -->
+                        <van-col span="8">状态: {{ getStatusText(item.status) }}</van-col>
+                        <!-- 挂单类型:1买,2卖 -->
+                        <van-col span="8">挂单类型: {{ getTypeText(item.type) }}</van-col>
+                    </van-row>
+                </van-cell-group>
+                <br>
+            </div>
+
+
+
         </div>
     </div>
 </template>
 
-<style scoped></style>
+<style scoped>
+.van-cell-group {
+    background-color: antiquewhite;
+    /* 设置圆角 */
+    border-radius: 8px;
+    /* 添加阴影效果 */
+    box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
+    /* 确保阴影效果不会被内部元素覆盖 */
+    overflow: hidden;
+}
+
+.row-col .van-col {
+    justify-content: center;
+    text-align: center;
+    font-size: 14px;
+    /* background-color: thistle; */
+}
+
+.listItem {
+    margin: auto;
+    width: 95%;
+}
+</style>

+ 37 - 9
src/views/position/PositionIndex.vue

@@ -23,22 +23,22 @@
           <div class="box2 l-f l-flex-c l-flex-j-a">
             <div class="TextGroup flex-col">
               <div class="main6 flex-col justify-between align-center">
-                <span class="word5">11.5</span>
-                <span class="word6">现价</span>
+                <span class="word5">{{ buyPrice }}</span>
+                <span class="word6">买入均价¥</span>
               </div>
             </div>
 
             <div class="TextGroup flex-col">
               <div class="main6 flex-col justify-between align-center">
-                <span class="word5">100.8</span>
-                <span class="word6">当日盈亏</span>
+                <span class="word5">{{ dailyDiff }}</span>
+                <span class="word6">当日盈亏</span>
               </div>
             </div>
 
             <div class="TextGroup flex-col">
               <div class="main6 flex-col justify-between align-center">
-                <span class="word5">2000.50</span>
-                <span class="word6">总盈亏</span>
+                <span class="word5">{{ totalDiff }}</span>
+                <span class="word6">总盈亏</span>
               </div>
             </div>
           </div>
@@ -95,8 +95,11 @@
               </template>
               <template #price-top>
                 <!-- status 状态:0过期,1生效,2撤单,3全部成交,4部分成交 -->
+                <!-- <div>
+                  交易状态:<van-tag plain round type="danger">{{ showStatusText(item.status) }}</van-tag>
+                </div> -->
                 <div v-if="item.status === '0'">交易状态:<van-tag plain round type="danger">过期</van-tag></div>
-                <div v-else-if="item.status === '1'">交易状态:<van-tag plain round type="success">成交</van-tag></div>
+                <div v-else-if="item.status === '1'">交易状态:<van-tag plain round type="success">生效</van-tag></div>
                 <div v-else-if="item.status === '2'">交易状态:<van-tag plain round>撤单</van-tag></div>
                 <div v-else-if="item.status === '3'">交易状态:<van-tag plain round type="primary">全部成交</van-tag></div>
                 <div v-else-if="item.status === '4'">交易状态:<van-tag plain round type="warning">部分成交</van-tag></div>
@@ -129,7 +132,7 @@ import sHeader from "@/components/SimpleHeader"
 import { onMounted, reactive, ref } from "vue"
 import SearchPop from './SearchPop.vue';
 import TestComp from './TestComp.vue'
-import { listMyOrderHis } from "@/service/position";
+import { listMyOrderHis, getMyStock } from "@/service/position";
 
 const showSearchPop = ref(false);
 
@@ -138,12 +141,23 @@ const loading = ref(false)
 const finished = ref(false)
 const hisLength = ref(0)
 
+// const showStatusText = (statusVal) => {
+//   const statusMap = {
+//     0: '过期',
+//     1: '生效',
+//     2: '撤单',
+//     3: '全部成交',
+//     4: '部分成交',
+//   }
+//   return statusMap[statusVal] || '未知状态';
+// }
 
 const onLoad = async () => {
   if (!finished.value) {
     loading.value = true
     searchParams.current = searchParams.current + 1;
     getList();
+    getMyStockFunc();
   }
 };
 
@@ -168,9 +182,23 @@ const getList = async () => {
 }
 
 onMounted(
-  onLoad
+  onLoad,
 );
 
+const buyPrice = ref()
+const dailyDiff = ref()
+const totalDiff = ref()
+
+const getMyStockFunc = async () => {
+  const { data } = await getMyStock();
+  if (data.code === '00000') {
+    console.log("getMyStock >>>", data.data);
+    buyPrice.value = data.data.buyPrice
+    dailyDiff.value = data.data.dailyDiff
+    totalDiff.value = data.data.totalDiff
+  }
+}
+
 const searchClick = () => {
   console.log("点击搜索");
   showSearchPop.value = true;

+ 17 - 0
src/views/taskMessage/PendingOrder.vue

@@ -0,0 +1,17 @@
+<script setup>
+  import { ref } from 'vue'
+  import sHeader from "@/components/SimpleHeader";
+
+  const v = ref('')
+</script>
+
+<template>
+  <div>
+    <s-header name="付款" :noback="false"></s-header>
+    {{ v }}
+
+  </div>
+</template>
+
+<style scoped>
+</style>

+ 221 - 0
src/views/taskMessage/PendingOrderList.vue

@@ -0,0 +1,221 @@
+<template>
+  <!-- 挂单匹配列表 -->
+  <div class="pendingOrderList flex-col">
+    <s-header name="挂单匹配" :noback="false"></s-header>
+
+    <div class="pendingOrderBox flex-col">
+      <van-list v-model:loading="loading" v-model:error="error" :error-text="$t('common.reqFailClkReload')"
+        :finished="finished" :finished-text="$t('common.noMoreTxt')" offset="300" :immediate-check="false"
+        @load="onLoad">
+        <div class="searchRow flex-row justify-between">
+          <div class="flex-col">
+            <div class="flex-row justify-between bd3">
+              <!-- 图标 -->
+              <!-- <div class="flex-col outer4 proportionIcon"></div> -->
+              <span class="flex-col txt2">{{ $t("taskMessage.total")
+                }}<span class="discountNumber">{{ pendingOrderTotal }}</span>{{
+                  $t("taskMessage.recordsInTotal") }}</span>
+            </div>
+          </div>
+        </div>
+
+        <div class="listBox">
+          <div v-for="(item) in pendingOrderList" :key="item.id" class="listItem">
+            <div class="itemBox">
+
+              <div class="itemRow">
+                <span class="itemTitle">挂单价格:&nbsp;</span>{{
+                  item.price }}
+              </div>
+              <div class="itemRow">
+                <span class="itemTitle">委托数量:&nbsp;</span>{{
+                  item.entrustNumber }}
+              </div>
+              <div class="itemRow">
+                <span class="itemTitle">挂单类型:&nbsp;</span>{{
+                  showTypeText(item.type) }}
+              </div>
+              <!-- 状态:0过期,1生效,2撤单,3全部成交,4部分成交 -->
+              <div class="itemRow">
+                <span class="itemTitle">状态:&nbsp;</span>{{
+                  showStatusText(item.status) }}
+              </div>
+              <!-- if 0,1 不显示其他 -->
+              <!-- if 2 显示撤单时间 -->
+              <div v-if="item.status === '2'" class="itemRow">
+                <span class="itemTitle">撤单时间:&nbsp;</span>{{
+                  item.cancelTime }}
+              </div>
+              <!-- if 3,4 显示成交数量 -->
+              <div v-if="item.status === '3' || item.status === '4'" class="itemRow">
+                <span class="itemTitle">成交数量:&nbsp;</span>{{
+                  item.tradeNumber }}
+              </div>
+
+              <!-- 创建时间 -->
+              <div class="itemRow">
+                <span class="itemTitle">创建时间:&nbsp;</span>{{
+                  showDateTime(item.createTime) }}
+              </div>
+
+              <!-- 卖家确认时间 -->
+              <div class="itemRow" v-if="item.status === '1'">
+                <span class="itemTitle">卖家确认时间:&nbsp;</span>{{
+                  showDateTime(item.sellerConfirmTime)
+                }}
+              </div>
+
+              <!-- 去付款 -->
+              <div v-if="item.status === '3' || item.status === '4'" class="itemRow"
+                style="display: flex; justify-content: flex-end">
+                <van-button span="5" round type="primary" :style="{
+                  height: '2em',
+                  padding: '0 1.2em',
+                  margin: '0 1em',
+                  backgroundColor: 'rgb(200, 55, 95 / 80%)', // 红色背景,不透明度为100%
+                  color: '#fff', // 文字颜色为白色
+                  boxShadow: '0 2px 8px rgba(255, 55, 95, 0.3)', // 添加阴影效果
+                  transition: 'all 0.3s ease' // 添加过渡效果,使变化更平滑
+                }" @click="toBuy(item)">
+                  付款
+                </van-button>
+              </div>
+
+              <div class="itemRow" style="display: flex; justify-content: flex-end">
+                <!-- 已确认 -->
+                <span v-if="item.status === '1'" style="color: #4fc08d">{{
+                  showStatusText(item.status)
+                }}</span>
+                <!-- 特殊取消 -->
+                <span v-if="item.status === '2'" style="color: #ff0000">{{
+                  showStatusText(item.status)
+                }}</span>
+              </div>
+
+            </div>
+          </div>
+        </div>
+      </van-list>
+    </div>
+
+  </div>
+</template>
+
+<script setup>
+import { onMounted, reactive, ref } from "vue";
+import sHeader from "@/components/SimpleHeader";
+import { getPagePendList } from "@/service/pendingOrder";
+import { showFailToast } from "vant";
+import { getLoginUser, styleUrl } from "@/common/js/utils";
+import dateUtil from "@/utils/dateUtil";
+import { useRouter } from 'vue-router'
+import { useTradeStore } from '@/stores/trade';
+
+
+const typeTexts = ['未知类型', '买', '卖'];
+const showTypeText = (typeValue) => {
+  return typeTexts[typeValue] || typeTexts[0];
+};
+
+const showStatusText = (statusVal) => {
+  const statusMap = {
+    0: '过期',
+    1: '生效',
+    2: '撤单',
+    3: '全部成交',
+    4: '部分成交',
+  }
+  return statusMap[statusVal] || '未知状态';
+}
+
+const router = useRouter()
+
+const user = getLoginUser();
+const loading = ref(false); // 加载状态
+const error = ref(false); // 错误状态
+const finished = ref(false); // 结束翻页状态
+const pendingOrderList = ref([]); // 列表集合
+const pendingOrderTotal = ref(0); // 列表总数
+let searchParams = reactive({
+  current: 1, // 当前页,默认第一页
+  size: 10, // 页大小,默认10条
+});
+
+
+// 查询列表
+const searchGetList = () => {
+  pendingOrderList.value = [];
+  searchParams.current = 1;
+  getList();
+};
+// 获取新人账号注册审批列表数据
+const getList = async () => {
+  finished.value = false;
+  const { data } = await getPagePendList(
+    Object.assign({}, searchParams)
+  );
+  if (data.code === "00000") {
+    if (searchParams.current === 0) {
+      pendingOrderList.value = [];
+    }
+    // 列表值叠加
+    pendingOrderList.value = pendingOrderList.value.concat(
+      data.data.records
+    );
+    pendingOrderTotal.value = data.data.total;
+    if (pendingOrderList.value.length === data.data.total) {
+      finished.value = true;
+    }
+    loading.value = false;
+  } else {
+    showFailToast(data.message);
+  }
+};
+
+const showDateTime = (date) => {
+  return date
+    ? dateUtil.formateDate(new Date(date), "yyyy-MM-dd hh:mm:ss")
+    : "";
+};
+
+
+// const userStore = useUserStore();
+const tradeStore = useTradeStore();
+// 去付款
+const toBuy = (item) => {
+  // userStore.setUserInfo(item);
+  tradeStore.setTradeItem(item);
+  router.push({ name: 'buyConf' });
+};
+
+
+// 滚动加载
+const onLoad = () => {
+  if (!finished.value) {
+    searchParams.current = searchParams.current + 1;
+    getList();
+  }
+};
+
+// 是否有操作的权限
+const isOper = ref(true);
+// 初始化页面获取列表
+onMounted(async () => {
+  // 加载样式
+  styleUrl('pendingOrderList');
+  if (user) {
+    // searchParams.adminId = user.id;
+    searchGetList();
+
+    // 如果不是admin账号,不能有操作权限
+    if (user.userName != 'admin') {
+      isOper.value = false;
+    }
+  }
+});
+
+</script>
+
+<style lang="less" scoped>
+@import "../../common/style/common.less";
+</style>

+ 27 - 25
src/views/taskMessage/TaskAccount.vue

@@ -2,19 +2,21 @@
 import sHeader from "@/components/SimpleHeader";
 import { auditUserApply } from "@/service/taskAccount";
 import { ref, onMounted, onBeforeUnmount } from "vue";
-import { showToast, showFailToast } from "vant";
+import { showToast, showFailToast, showSuccessToast } from "vant";
 import { useUserStore } from '@/stores/user';
 import { useRouter } from 'vue-router'
 
-const userName = ref('');
-const phone = ref('');
-const identityCard = ref('');
-const payeeCode = ref('');
-const allowMaximum = ref('');
-const cardNo = ref('');
-const buyPriorityRank = ref(''); // 买卖优先级/奋斗贡献值
-
+const userName = ref('')
+const phone = ref('')
+const identityCard = ref('')
+const payeeCode = ref('')
+const allowMaximum = ref('') // 允许最大份额
+const cardNo = ref('')
+const buyPriorityRank = ref('') // 买卖优先级/奋斗贡献值,文字
+const level = ref('') // 买卖优先级/奋斗贡献值,值
+const stockNum = ref('') // 初始股票份额
 const applyId = ref('');
+
 const userStore = useUserStore();
 const router = useRouter();
 
@@ -44,6 +46,7 @@ const columns = [
 
 const onConfirm = ({ selectedOptions }) => {
   buyPriorityRank.value = selectedOptions[0]?.text;
+  level.value = selectedOptions[0]?.value;
   showPicker.value = false;
 };
 
@@ -67,11 +70,11 @@ onBeforeUnmount(() => {
 // 拒绝
 const rejectApply = async () => {
   const userCheck = {
-    userName: userName.value,
-    phone: phone.value,
-    identityCard: identityCard.value,
-    payeeCode: payeeCode.value,
-    cardNo: cardNo.value,
+    // userName: userName.value,
+    // phone: phone.value,
+    // identityCard: identityCard.value,
+    // payeeCode: payeeCode.value,
+    // cardNo: cardNo.value,
     applyId: applyId.value,
     pass: false
   }
@@ -88,28 +91,25 @@ const rejectApply = async () => {
 // 同意
 const approveApply = async () => {
 
-  if (!buyPriorityRank.value || !allowMaximum.value) {
+  if (!buyPriorityRank.value || !allowMaximum.value || !stockNum.value) {
     showFailToast('最大额度和奋斗值是必填项');
     return;
   }
 
+  console.log("allowMaximum >>>", allowMaximum.value);
   const userCheck = {
-    userName: userName.value,
-    phone: phone.value,
-    identityCard: identityCard.value,
-    payeeCode: payeeCode.value,
-    cardNo: cardNo.value,
     allowMaximum: allowMaximum.value,
-    level: buyPriorityRank.value,
+    level: level.value,
     applyId: applyId.value,
+    stockNum: stockNum.value,
     pass: true
   }
   const { data } = await auditUserApply(userCheck);
 
   if (data.code === "00000") {
     // 成功
-    // ElMessage.success("保存成功");
-    showToast("已同意");
+    // showToast("已同意");
+    showSuccessToast("已同意")
     router.go(-1)
   } else {
     showFailToast(data.message);
@@ -138,8 +138,10 @@ const approveApply = async () => {
         <van-popup v-model:show="showPicker" position="bottom">
           <van-picker :columns="columns" @confirm="onConfirm" @cancel="showPicker = false" />
         </van-popup>
-        <van-field v-model="allowMaximum" name="最大额度" label="最大额度" placeholder="最大额度" left-icon="points"
-          :rules="[{ required: true, message: '最大额度不能为空' }]" />
+        <van-field v-model="allowMaximum" name="允许最大份额" label="允许最大份额" placeholder="允许最大份额" left-icon="points"
+          :rules="[{ required: true, message: '允许最大份额不能为空' }]" />
+        <van-field v-model="stockNum" name="初始股票份额" label="初始股票份额" placeholder="初始股票份额" left-icon="points"
+          :rules="[{ required: true, message: '初始股票份额不能为空' }]" />
 
       </van-cell-group>
       <div style="margin: 20px 30px; display: flex; justify-content: center; align-items: center; gap: 50px;">

+ 1 - 1
src/views/taskMessage/TaskAccountList.vue

@@ -221,7 +221,7 @@ export default {
             if (user) {
                 searchParams.adminId = user.id;
                 searchGetList();
-                
+
                 // 如果不是admin账号,不能有操作权限
                 if (user.userName != 'admin') {
                     isOper.value = false;

+ 125 - 0
src/views/taskMessage/UserManage.vue

@@ -0,0 +1,125 @@
+<script setup>
+import sHeader from "@/components/SimpleHeader";
+import { banUserOrder } from "@/service/userManage";
+import { ref, onMounted, onBeforeUnmount } from "vue";
+import { showToast, showFailToast } from "vant";
+import { useUserStore } from '@/stores/user';
+import { useRouter } from 'vue-router'
+import dateUtil from "@/utils/dateUtil";
+
+const userName = ref('');
+const phone = ref('');
+const identityCard = ref('');
+const payeeCode = ref('');
+// const allowMaximum = ref('');
+// const cardNo = ref('');
+// const buyPriorityRank = ref(''); // 买卖优先级/奋斗贡献值
+const userId = ref(''); // 被禁用的用户id
+const stockNum = ref()
+// const applyId = ref('');
+const userStore = useUserStore();
+const router = useRouter();
+
+
+const startTime = ref('');
+const showStartTime = ref(false);
+const onConfStartTime = ({ selectedValues }) => {
+    startTime.value = selectedValues.join('-');
+    showStartTime.value = false;
+};
+
+const endTime = ref('')
+const showEndTime = ref(false)
+const onConfEndTime = ({ selectedValues }) => {
+    endTime.value = selectedValues.join('-');
+    showEndTime.value = false;
+};
+
+const minDate = ref(new Date(2024, 4, 1))
+
+onMounted(() => {
+    if (userStore.userInfo) {
+        console.log("userStore.userInfo >>>", userStore.userInfo);
+        userName.value = userStore.userInfo.userName;
+        phone.value = userStore.userInfo.phone;
+        identityCard.value = userStore.userInfo.identityCard;
+        payeeCode.value = userStore.userInfo.payeeCode;
+        // cardNo.value = userStore.userInfo.cardNo;
+        // applyId.value = userStore.userInfo.id;
+        userId.value = userStore.userInfo.userId;
+        stockNum.value = userStore.userInfo.stockNum;
+    }
+});
+
+// 当组件卸载时清除用户信息
+onBeforeUnmount(() => {
+    userStore.clearUserInfo();
+});
+
+// 禁用用户
+const banUserClc = async () => {
+    const startTimeDate = new Date(startTime.value);
+    const endTimeDate = new Date(endTime.value);
+    const startTimeFmt = dateUtil.formateDate(startTimeDate, "yyyy-MM-dd") + " 00:00:00";
+    const endTimeFmt = dateUtil.formateDate(endTimeDate, "yyyy-MM-dd") + " 00:00:00";
+    
+    console.log("Fmt >>>", startTimeFmt, endTimeFmt);
+    const userCheck = {
+        startTime: startTimeFmt,
+        endTime: endTimeFmt,
+        userId: userId.value
+    }
+    const { data } = await banUserOrder(userCheck);
+
+    if (data.code === "00000") {
+        // 成功
+        showToast("已禁止该用户交易");
+        router.go(-1)
+    } else {
+        showFailToast(data.message);
+    }
+}
+
+</script>
+
+<template>
+    <!-- 禁止用户交易-->
+    <div class="fife" style="background-color:#ebedf0">
+        <s-header :name="'禁止用户交易'" :noback="false"></s-header>
+        <br>
+        <van-form>
+            <van-cell-group inset>
+                <van-field v-model="userName" readonly name="用户名" label="用户名" placeholder="用户名" left-icon="smile-o" />
+                <van-field v-model="phone" readonly name="手机号码" label="手机号码" placeholder="手机号码" left-icon="phone-o"
+                    :rules="[{ required: true, message: '手机号码不能为空' }]" />
+                <van-field v-model="identityCard" readonly name="身份证号" label="身份证号" placeholder="身份证号"
+                    left-icon="contact-o" />
+                <van-field v-model="payeeCode" readonly name="支付宝号" label="支付宝号" placeholder="支付宝号"
+                    left-icon="certificate" />
+
+                <van-field v-model="stockNum" readonly name="当前股票份额" label="当前股票份额" placeholder="当前股票份额" left-icon="points" />
+
+                <van-field v-model="startTime" is-link readonly name="startDatePicker" label="开始时间"
+                    placeholder="选择开始禁用时间" @click="showStartTime = true" left-icon="clock-o" />
+                <van-popup v-model:show="showStartTime" position="bottom">
+                    <van-date-picker @confirm="onConfStartTime" @cancel="showStartTime = false" :min-date="minDate" />
+                </van-popup>
+
+                <van-field v-model="endTime" is-link readonly name="endDatePicker" label="结束时间" placeholder="选择结束禁用时间"
+                    @click="showEndTime = true" left-icon="clock-o" />
+                <van-popup v-model:show="showEndTime" position="bottom">
+                    <van-date-picker @confirm="onConfEndTime" @cancel="showEndTime = false" :min-date="minDate" />
+                </van-popup>
+
+
+            </van-cell-group>
+            <div style="margin: 20px 30px; display: flex; justify-content: center; align-items: center; gap: 50px;">
+                <van-button round class="custom-button" type="primary" size="small" @click="banUserClc"
+                    block>禁用</van-button>
+            </div>
+        </van-form>
+
+    </div>
+</template>
+
+<style scoped></style>

+ 179 - 0
src/views/taskMessage/UserManageList.vue

@@ -0,0 +1,179 @@
+<script setup>
+import { onMounted, reactive, ref } from "vue";
+import sHeader from "@/components/SimpleHeader";
+import { pageUserList } from "@/service/userManage"
+import { showFailToast } from "vant";
+import { getLoginUser, styleUrl } from "@/common/js/utils";
+import { useRouter } from 'vue-router'
+import { useUserStore } from '@/stores/user';
+
+const router = useRouter()
+
+const user = getLoginUser();
+const loading = ref(false); // 加载状态
+const error = ref(false); // 错误状态
+const finished = ref(false); // 结束翻页状态
+
+
+// state 用户状态:1正常,2禁用,3删除
+const showStateText = (state) => {
+            if (state === '1') {
+                return "正常";
+            }
+            if (state === '2') {
+                return "禁用中";
+            }
+            if (state === '3') {
+                return "已删除";
+            }
+            return "未知";
+        };
+
+const userManageList = ref([]); // 列表集合
+const userInfoTotal = ref(0); // 用户列表总数
+let searchParams = reactive({
+    current: 1, // 当前页,默认第一页
+    size: 10, // 页大小,默认10条
+});
+
+// 滚动加载
+const onLoad = () => {
+    if (!finished.value) {
+        searchParams.current = searchParams.current + 1;
+        getList();
+    }
+};
+// 查询列表
+const searchGetList = () => {
+    userManageList.value = [];
+    searchParams.current = 1;
+    getList();
+};
+// 获取用户管理列表数据
+const getList = async () => {
+
+    const { data } = await pageUserList(
+        Object.assign({}, searchParams)
+    );
+    if (data.code === "00000") {
+        // 列表值叠加
+        userManageList.value = userManageList.value.concat(
+            data.data.records
+        );
+        userInfoTotal.value = data.data.total;
+        if (userManageList.value.length === data.data.total) {
+            finished.value = true;
+        }
+        loading.value = false;
+    } else {
+        showFailToast(data.message);
+    }
+};
+
+const userStore = useUserStore();
+// 去管理账号,禁用账号
+const toManageUser = (item) => {
+    userStore.setUserInfo(item);
+    router.push({ name: 'userManage' });
+};
+
+// 是否有操作的权限
+const isOper = ref(true);
+// 初始化页面获取列表
+onMounted(async () => {
+    // 加载样式
+    styleUrl('pendingOrderList');
+    if (user) {
+        // searchParams.adminId = user.userId;
+        searchGetList();
+
+        // 如果不是admin账号,不能有操作权限
+        if (user.userName != 'admin') {
+            isOper.value = false;
+        }
+    }
+});
+</script>
+<!-- 用户审批 -->
+<!-- d点击后跳转会上一页, -->
+<!-- 点击后进行设置,设置后对到列表页 -->
+
+<template>
+    <!-- 用户管理列表 -->
+    <div class="pendingOrderList flex-col">
+        <s-header name="用户管理" :noback="false"></s-header>
+
+        <div class="pendingOrderBox flex-col">
+            <van-list v-model:loading="loading" v-model:error="error" :error-text="$t('common.reqFailClkReload')"
+                :finished="finished" :finished-text="$t('common.noMoreTxt')" offset="300" :immediate-check="false"
+                @load="onLoad">
+                <div class="listBox">
+                    <div v-for="(item) in userManageList" :key="item.phone" class="listItem">
+                        <div class="itemBox">
+
+                            <div class="itemRow">
+                                <span class="itemTitle">用户名:&nbsp;</span>{{
+                                    item.userName }}
+                            </div>
+                            <div class="itemRow">
+                                <span class="itemTitle">手机号码:&nbsp;</span>{{
+                                    item.phone }}
+                            </div>
+                            <!-- <div class="itemRow">
+                                <span class="itemTitle">支付宝号:&nbsp;</span>{{
+                                    item.payeeCode }}
+                            </div> -->
+                            <div class="itemRow">
+                                <span class="itemTitle">当前股票份额:&nbsp;</span>{{
+                                    item.stockNum }}
+                            </div>
+
+                            <!-- isBan禁用:去禁用账号> -->
+                            <div class="itemRow">
+                                <span class="itemTitle">账号状态:&nbsp;</span><span style="color: red">{{
+                                    showStateText(item.state)
+                                    }}</span>
+                            </div>
+                            <!-- state 用户状态:1正常,2禁用,3删除 -->
+                            <!-- // 正常情况下显示按钮,非正常情况下仅显示状态 -->
+
+                            <!-- 禁用/启用账号 -->
+                            <div v-if="item.state === '1' && isOper" class="itemRow" style="display: flex; justify-content: flex-end">
+                                <van-button span="5" round type="primary" :style="{
+                                    height: '2em',
+                                    padding: '0 1.2em',
+                                    margin: '0 1em',
+                                    backgroundColor: 'rgb(200, 55, 95 / 80%)', // 红色背景,不透明度为100%
+                                    color: '#fff', // 文字颜色为白色
+                                    boxShadow: '0 2px 8px rgba(255, 55, 95, 0.3)', // 添加阴影效果
+                                    transition: 'all 0.3s ease' // 添加过渡效果,使变化更平滑
+                                }" @click="toManageUser(item)">
+                                    禁用账号
+                                </van-button>
+                            </div>
+
+                            <div class="itemRow" style="display: flex; justify-content: flex-end">
+                                <!-- 未禁用 -->
+                                <span v-if="item.status === '1'" style="color: #4fc08d">{{
+                                    showStatusText(item.status)
+                                    }}</span>
+                                <!-- 已禁用 -->
+                                <span v-if="item.status === '2'" style="color: #ff0000">{{
+                                    showStatusText(item.status)
+                                    }}</span>
+                            </div>
+
+                        </div>
+                    </div>
+                </div>
+            </van-list>
+        </div>
+
+    </div>
+</template>
+
+
+
+<style lang="less" scoped>
+@import "../../common/style/common.less";
+</style>

+ 37 - 24
src/views/taskMessage/index.vue

@@ -1,18 +1,53 @@
+<script setup>
+import { onMounted, ref } from 'vue';
+import sHeader from "@/components/SimpleHeader";
+import { useRouter } from "vue-router";
+import { getLoginUser, styleUrl } from "@/common/js/utils";
+
+const router = useRouter();
+const user = getLoginUser();
+const isAdmin = ref(false);
+
+const checkIsAdmin = async () => {
+  if (user.phone === '13631231970') {
+    isAdmin.value = true
+  }
+  console.log("isAdmin >>>", isAdmin.value);
+}
+// 初始化页面获取列表
+onMounted(async () => {
+  styleUrl('taskMessage');
+  checkIsAdmin()
+});
+const pushPageList = (url) => {
+  router.push(url);
+}
+
+</script>
+
 <template>
   <!-- 任务消息列表 -->
   <div class="taskMessagePage flex-col">
     <s-header :name="$t('taskMessage.taskMessage')" :noback="false"></s-header>
     <div class="taskMessageBox flex-col">
       <!-- 账号申请 -->
-      <div class="taskListRow flex-col" @click="pushPageList('/taskAccountList')">
+      <div v-if="isAdmin" class="taskListRow flex-col" @click="pushPageList('/taskAccountList')">
         <div class="taskIcon registerAccountIcon"></div>
         <div class="taskRight">
           <div class="taskTitle">新人注册</div>
         </div>
       </div>
 
+      <!-- 用户管理 -->
+      <div v-if="isAdmin" class="taskListRow flex-col" @click="pushPageList('/userManageList')">
+        <div class="taskIcon userManageIcon"></div>
+        <div class="taskRight">
+          <div class="taskTitle">用户管理</div>
+        </div>
+      </div>
+
       <!-- 挂单匹配 -->
-      <div class="taskListRow flex-col" @click="pushPageList('/orderMatchNotice')">
+      <div class="taskListRow flex-col" @click="pushPageList('/pendingOrderList')">
         <div class="taskIcon orderMatchIcon"></div>
         <div class="taskRight">
           <div class="taskTitle">挂单匹配</div>
@@ -31,28 +66,6 @@
   </div>
 </template>
 
-<script>
-import { onMounted } from 'vue';
-import sHeader from "@/components/SimpleHeader";
-import { useRouter } from "vue-router";
-import { getLoginUser, styleUrl } from "@/common/js/utils";
-
-export default {
-  components: { sHeader },
-  setup() {
-    const router = useRouter();
-    const user = getLoginUser();
-    // 初始化页面获取列表
-    onMounted(async () => {
-      styleUrl('taskMessage');
-    });
-    const pushPageList = (url) => {
-      router.push(url);
-    }
-    return { pushPageList, user };
-  }
-};
-</script>
 
 <style lang="less" scoped>
 @import "../../common/style/common.less";

+ 3 - 0
src/views/trading/TradingBuy.vue

@@ -3,12 +3,14 @@ import { onMounted, ref } from 'vue';
 import sHeader from "@/components/SimpleHeader";
 import { showConfirmDialog, showFailToast, showSuccessToast } from 'vant';
 import { addPendOrder, queryAllowPendNum } from "@/service/trading";
+// import { useRouter } from 'vue-router'
 
 const buyNum = ref('100');
 const unitPrice = ref('10');
 const allowMaximum = ref(0);
 const active = ref(0);
 
+// const router = useRouter();
 
 onMounted(async () => {
     try {
@@ -49,6 +51,7 @@ const onSubmitBuy = async (values) => {
       const { data } = await addPendOrder(params);
       if (data.code === '00000') {
         showSuccessToast("买入挂单成功");
+        // router.go(-1)
       } else {
         showFailToast(data.message);
       }

+ 7 - 5
src/views/user/UserIndex.vue

@@ -30,8 +30,8 @@
           <div class="userLine"></div>
           <!-- 用户名 userName -->
           <div class="userId">
-            <!-- <p class="userText">{{ accountDetail.userName }}</p> -->
-            <p class="userText">test</p>
+            <p class="userText">{{ accountDetail.userName }}</p>
+            <!-- <p class="userText">test</p> -->
             <p class="userText">用户名</p>
           </div>
         </div>
@@ -113,7 +113,7 @@
             <div class="taskIcon buyConfIcon"></div>
             <div class="taskRight">
               <div class="taskTitle">
-                付款信息
+                买入付款确认
               </div>
             </div>
           </div>
@@ -123,7 +123,7 @@
             <div class="taskIcon sellConfIcon"></div>
             <div class="taskRight">
               <div class="taskTitle">
-                确认收款
+                卖家收款确认
               </div>
             </div>
           </div>
@@ -315,7 +315,9 @@ export default {
     };
 
     const hiddenCardNo = ref('');
-    hiddenCardNo.value = user.cardNo.replace(/^(\d{4}).*?(\d{4})$/, "$1********$2");
+    if(user.cardNo) {
+      hiddenCardNo.value = user.cardNo.replace(/^(\d{4}).*?(\d{4})$/, "$1********$2");
+    }
 
     const eyeOpen = ref(false);
     const clickEye = () => {