Browse Source

模板初始化

吴sir 1 month ago
parent
commit
a504e59209
100 changed files with 410 additions and 13906 deletions
  1. 1 2
      package.json
  2. 0 11
      src/App.vue
  3. 0 63
      src/api/customer.js
  4. 0 12
      src/api/path/component.api.js
  5. 0 34
      src/api/path/dictionary.js
  6. 0 75
      src/api/path/finance.js
  7. 0 55
      src/api/path/flowPool.api.js
  8. 0 106
      src/api/path/lotCard.api.js
  9. 0 56
      src/api/path/order.js
  10. 0 27
      src/api/path/purchase.js
  11. 0 6
      src/api/path/renewalOrder.js
  12. 0 20
      src/api/path/star.api.js
  13. 0 71
      src/api/path/tariffManagement.api.js
  14. 0 157
      src/components/Form/index.vue
  15. 0 290
      src/components/Layout/components/layout/components/HongKong.vue
  16. 0 295
      src/components/Layout/components/layout/components/Thailand.vue
  17. 290 8
      src/components/Layout/components/layout/menu.vue
  18. 0 161
      src/components/Search/index.vue
  19. 0 73
      src/components/Steps/StepButton.vue
  20. 0 126
      src/components/Steps/StepForm.vue
  21. 0 121
      src/components/Steps/index.vue
  22. 0 28
      src/hooks/enum.js
  23. 0 78
      src/mixins/index.js
  24. 0 13
      src/router/router.system.js
  25. 2 4
      src/router/router.update.js
  26. 0 59
      src/store/modules/routerTag.js
  27. 1 54
      src/utils/axios.js
  28. 0 68
      src/views/admin/OperationLog/config.js
  29. 0 57
      src/views/admin/OperationLog/index.vue
  30. 0 425
      src/views/admin/customer/NewCustomerForm.vue
  31. 0 93
      src/views/admin/customer/config.js
  32. 0 145
      src/views/admin/customer/index.vue
  33. 0 132
      src/views/admin/flowPool/FlowpoolRecord/index.vue
  34. 0 212
      src/views/admin/flowPool/Forwardflowpool/index.vue
  35. 0 190
      src/views/admin/flowPool/components/GuideCard.vue
  36. 0 236
      src/views/admin/flowPool/components/add.vue
  37. 0 279
      src/views/admin/flowPool/components/forewarning.vue
  38. 0 189
      src/views/admin/flowPool/components/openExport.vue
  39. 0 270
      src/views/admin/flowPool/config.js
  40. 0 292
      src/views/admin/flowPool/rearFlowPool/index.vue
  41. 0 228
      src/views/admin/order/BuyCard/Card.vue
  42. 0 265
      src/views/admin/order/BuyCard/detaile.vue
  43. 0 305
      src/views/admin/order/BuyCard/index.vue
  44. 0 75
      src/views/admin/order/BuyCard/returnCard.vue
  45. 0 83
      src/views/admin/order/BuyCard/status.vue
  46. 0 161
      src/views/admin/order/CancelOrder/detaile.vue
  47. 0 204
      src/views/admin/order/CancelOrder/index.vue
  48. 0 81
      src/views/admin/order/CancelOrder/status.vue
  49. 0 164
      src/views/admin/order/ChangeOrder/detaile.vue
  50. 0 187
      src/views/admin/order/ChangeOrder/index.vue
  51. 0 83
      src/views/admin/order/ChangeOrder/status.vue
  52. 0 395
      src/views/admin/order/PackageRecharge/index.vue
  53. 0 161
      src/views/admin/order/RenewalOrder/detaile.vue
  54. 0 196
      src/views/admin/order/RenewalOrder/index.vue
  55. 0 81
      src/views/admin/order/RenewalOrder/status.vue
  56. 0 167
      src/views/admin/order/ReturnCard/detaile.vue
  57. 0 185
      src/views/admin/order/ReturnCard/index.vue
  58. 0 83
      src/views/admin/order/ReturnCard/status.vue
  59. 0 102
      src/views/admin/order/SetmealOrder/index.vue
  60. 0 102
      src/views/admin/order/WithdrawalManagement/index.vue
  61. 0 202
      src/views/admin/order/config.js
  62. 0 235
      src/views/admin/supplier/NewSupplierForm.vue
  63. 0 151
      src/views/admin/supplier/index.vue
  64. 0 356
      src/views/admin/tariffManagement/Management/add.vue
  65. 0 298
      src/views/admin/tariffManagement/SetMeal/addSetMeal.vue
  66. 0 233
      src/views/admin/tariffManagement/SetMeal/index.vue
  67. 0 151
      src/views/admin/tariffManagement/TariffRecord/index.vue
  68. 0 558
      src/views/admin/tariffManagement/config.js
  69. 0 249
      src/views/admin/tariffManagement/index.vue
  70. 0 201
      src/views/admin/trafficList/NewDataPackageForm.vue
  71. 0 88
      src/views/admin/trafficList/config.js
  72. 0 118
      src/views/admin/trafficList/index.vue
  73. 0 433
      src/views/financialManagement/accountBalance/index.vue
  74. 0 94
      src/views/financialManagement/appPuy/index.vue
  75. 0 283
      src/views/financialManagement/config.js
  76. 0 214
      src/views/financialManagement/customerTopsUp/index.vue
  77. 0 295
      src/views/financialManagement/trafficDetails/index.vue
  78. 0 428
      src/views/home/index.vue
  79. 0 117
      src/views/login/components/HongKong/index.vue
  80. 0 162
      src/views/login/components/HongKong/login-form.vue
  81. 0 118
      src/views/login/components/Thailand/index.vue
  82. 112 7
      src/views/login/index.vue
  83. 1 1
      src/views/login/login-form.vue
  84. 0 31
      src/views/lotCard/cardList/add.vue
  85. 0 378
      src/views/lotCard/cardList/config.js
  86. 0 186
      src/views/lotCard/cardList/index.vue
  87. 0 415
      src/views/lotCard/cardList/trafficUseDialog.vue
  88. 0 0
      src/views/system/dict/config.js
  89. 0 0
      src/views/system/dict/index.vue
  90. 0 0
      src/views/system/dictionary/DictionaryForm.vue
  91. 0 0
      src/views/system/dictionary/config.js
  92. 0 0
      src/views/system/dictionary/index.vue
  93. 0 0
      src/views/system/menu/config.js
  94. 3 3
      src/views/system/menu/index.vue
  95. 0 0
      src/views/system/role/config.js
  96. 0 0
      src/views/system/role/index.vue
  97. 0 0
      src/views/system/role/modalMode.vue
  98. 0 0
      src/views/system/user/config.js
  99. 0 0
      src/views/system/user/form.vue
  100. 0 0
      src/views/system/user/index.vue

+ 1 - 2
package.json

@@ -4,8 +4,7 @@
   "version": "0.0.0",
   "type": "module",
   "scripts": {
-    "dev": "cross-env VITE_DEV_TYPE=0 vite",
-    "dev:xg": "cross-env VITE_DEV_TYPE=1 vite",
+    "dev": "vite",
     "build:dev": "cross-env VITE_DEV_TYPE=0  vite build --mode pro",
     "preview": "vite preview",
     "build:xg": "cross-env VITE_DEV_TYPE=1 vite build --mode pro"

+ 0 - 11
src/App.vue

@@ -29,20 +29,9 @@ provide('reloadRoutePage', () => {
   })
 })
 
-// 获取用户ip地址 
-async function getIpClient() {
-    try {
-        const response = await axios.get('https://ipinfo.io/json');
-        systemStore.USER_IP = response.data
-        localStorage.setItem('IPCONFIG', JSON.stringify(response.data))
-    } catch (error) {
-        console.error(error);
-    }
-}
 
 onMounted(async () => {
   AcquisitionArea()
-  getIpClient()
 })
 </script>
 

+ 0 - 63
src/api/customer.js

@@ -1,63 +0,0 @@
-import service from '../utils/axios'
-
-export function getCustomerList(data) {
-    return service({
-        url: '/app/user/getCustomerList',
-        method: 'post',
-        data
-    })
-}
-
-export function addCustomer(data) {
-    return service({
-        url: 'admin/platform/addCustomer',
-        method: 'post',
-        data
-    })
-}
-
-export function updateCustomer(data) {
-    return service({
-        url: "admin/platform/updateCustomer",
-        method: "post",
-        data,
-    });
-}
-
-export function deleteCustomer(data) {
-    return service({
-        url: '/customer/delete',
-        method: 'post',
-        data
-    })
-}
-
-export function getCustomer(data) {
-    return service({
-        url: "/app/user/getCustomer",
-        method: "post",
-        data,
-    });
-}
-
-// 获取客户列表
-export  function  getMessUserList(data){
-    return service({
-        url: 'admin/platform/customerList',
-        method: 'post',
-        data
-    })
-}
-// 客户详情
-export  function  deleteMessUser(params){
-    return service.get('admin/platform/customerInfo', {params})
-}
-
-// 操作日志
-export function OperationLogSetNear(data){
-    return service({
-        url: '/logs/logOperation',
-        method: 'post',
-        data
-    })
-}

+ 0 - 12
src/api/path/component.api.js

@@ -1,12 +0,0 @@
-
-import service from '../../utils/axios'
-
-// 保存物料
-export function componentSave(param) {
-  return service.post('/admin/component/save', param)
-}
-
-// 获取物料
-export function componentList(param) {
-  return service.post('/admin/component/list', param)
-}

+ 0 - 34
src/api/path/dictionary.js

@@ -1,34 +0,0 @@
-import service from '../../utils/axios'
-
-// 获取字典列表
-export function getDictionaryList(param) {
-  return service.post('/admin/dic/list', param)
-}
-
-export const getDictionaryById = async (id) => {
-  // 模拟 API 调用延迟
-  await new Promise(resolve => setTimeout(resolve, 500));
-  return {
-    id,
-    label: `Dictionary ${id}`,
-    value: `Value ${id}`,
-    typeLabel: 'Type Label',
-    typeId: 'Type ID',
-    description: 'Description',
-    sortNo: 1,
-  };
-};
-
-export const addDictionary = async (data) => {
-  // 模拟 API 调用延迟
-  await new Promise(resolve => setTimeout(resolve, 500));
-  console.log('API: Adding dictionary item', data);
-  return { ...data, id: Date.now() };
-};
-
-export const updateDictionary = async (data) => {
-  // 模拟 API 调用延迟
-  await new Promise(resolve => setTimeout(resolve, 500));
-  console.log('API: Updating dictionary item', data);
-  return data;
-};

+ 0 - 75
src/api/path/finance.js

@@ -1,75 +0,0 @@
-import service from '../../utils/axios'
-
-// 查询充值记录
-export function getTopUpRecordList(data) {
-    return service({
-        url: '/admin/platform/topUpRecord',
-        method: 'post',
-        data
-    })
-}
-// 充值
-export function topUpAs(data) {
-    return service({
-        url: '/admin/platform/topUp',
-        method: 'post',
-        data
-    })
-}
-// 获取客户列表
-export function getCustomerList(data) {
-    return service({
-        url: '/admin/platform/customerList',
-        method: 'post',
-        data
-    })
-}
-// 客户流量消耗明细
-export function getSimConsumptionDetailsList(data) {
-    return service({
-        url: '/admin/platform/simConsumptionDetails',
-        method: 'post',
-        data
-    })
-}
-// 客户流量消耗明细-详情
-export function getUserSimInfo(params) {
-    return service({
-        url: '/admin/platform/userSimInfo',
-        method: 'get',
-        params
-    })
-}
-// 客户端-账户余额卡片
-export function getWalletCard(params) {
-    return service({
-        url: '/admin/client/walletCard',
-        method: 'get',
-        params
-    })
-}
-
-// 客户详情
-export  function  deleteMessUser(params){
-    return service.get('admin/platform/customerInfo', {params})
-}
-
-
-// H5充值记录
-export function getAdiroePuyList(data) {
-  return service({
-    url: '/admin/sim/payOrders',
-    method: 'post',
-    data
-  })
-}
-
-
-// 账户余额管理
-export function getWalletList(data) {
-    return service({
-        url: '/admin/platform/monthBill',
-        method: 'post',
-        data
-    })
-}

+ 0 - 55
src/api/path/flowPool.api.js

@@ -1,55 +0,0 @@
-
-import service from '../../utils/axios'
-
-// 分销商
-// 新增
-export function addTrafficPool(param) {
-    return service.post('/admin/platform/addTrafficPool', param)
-}
-// list
-export function trafficPoolList(param) {
-    return service.post('/admin/platform/tariffList', param)
-}
-// 编辑
-export function updateTrafficPool(param) {
-    return service.post('/admin/platform/updateTrafficPool', param)
-}
-// 删除
-export function deleteTrafficPool(params) {
-    return service.get('/admin/platform/deleteTrafficPool', { params })
-}
-
-// 卡信息列表
-export  function  getCardList (data) {
-    return service.post('admin/sim/cardInfoList',data)
-}
-
-// 获取资费下卡列表
-export  function  updateCardList (params) {
-    return service.get('admin/platform/getTariffCard',{params})
-}
-
-// 流量池接口
-export function lotCatdList(data){
-    return service.post('/admin/platform/trafficPoolList', data)
-}
-
-// 创建预警
-export  function  createWarning(data){
-    return service.post('/admin/alert/warningCreate',data)
-}
-
-// 修改预警
-export  function  updateWarning(data){
-    return service.post('/admin/alert/warningUpdate',data)
-}
-
-// 流量池操作记录
-export function updateFlowPoolData(data){
-    return service.post('/admin/platform/trafficPoolListRecord',data)
-}
-
-// 客户端流量池
-export function updateUserFloter(data){
-    return service.post('/admin/platform/trafficPoolList',data)
-}

+ 0 - 106
src/api/path/lotCard.api.js

@@ -1,106 +0,0 @@
-import service from "../../utils/axios";
-
-
-// ----------------------------流量管理---------------------------------
-// 流量列表
-export function dataPlanList(param) {
-    return service.post("/admin/sim/dataPlanList", param);
-}
-
-// ----------------------------卡管理---------------------------------
-// 卡信息列表
-export function cardInfoList(param) {
-    return service.post("/admin/sim/cardInfoList", param);
-}
-
-// 卡信息导入
-export function cardInfoImport(param) {
-    return service.post("/admin/sim/cardInfoImport", param);
-}
-
-// 卡-下发用户
-export function cardIssue(param) {
-    return service.post("/admin/sim/cardIssue", param);
-}
-
-// ----------------------------订单管理---------------------------------
-// 订单管理
-export function orderList(param) {
-    return service.post("/admin/sim/cardInfoUpdate", param);
-}
-
-
-// 订购生成订单
-export function setOrderDataPlan(param) {
-    return service.post("/admin/sim/setOrderDataPlan", param);
-}
-
-// 取消订单订单
-export function orderCancel(param) {
-    return service.post("/admin/sim/orderCancel", param);
-}
-
-// 取消订单订单
-export function orderFlowData(params) {
-    return service.get("/admin/sim/orderFlowData", { params });
-}
-
-// 查询订单日志
-export function getOrderLogsList(params) {
-    return service.post("/metadata/getOrderLogsList", params);
-}
-
-// 获取流量包数据
-export function getDataPlanList(params) {
-    return service.post("/metadata/getDataPlanList", params);
-}
-
-// CDR详单查询
-export function getDataCDR(params) {
-    return service.post("/admin/sim/newSimCDR", params);
-}
-
-
-//  CDR日期查询 
-
-export function getDataCDRDate(params) {
-    return service.post("/scc/v1/cdr-daily", params);
-}
-
-// 暂停SIM卡服务
-export function PauseSIMService(params) {
-    return service.post("/admin/sim/stopSim", params);
-}
-
-
-// 恢复SIM卡服务
-export function RecoverSIMService(data) {
-    return service.post("/admin/sim/runeSim", data);
-}
-
-// 关闭SIM
-export function OffSIMCard(data) {
-    return service.post("/admin/sim/closeSim", data);
-}
-
-// 操作日志
-export function OperationRecord(data) {
-    return service.post("/logs/logCardOperation", data);
-}
-
-// 查询当前卡下的充值记录
-export function getOrderCard(data){
-    return service.post("/admin/sim/payOrders", data);
-}
-
-
-// 查询使用量
-export function getFlowData(data) {
-    return service.post("/admin/sim/simCDR", data);
-}
-
-// 同步卡清单流量数据
-
-export function syncFlowData(data) {
-    return service.post("/admin/sim/syncSimCDR", data);
-}

+ 0 - 56
src/api/path/order.js

@@ -1,56 +0,0 @@
-import service from "../../utils/axios";
-
-// 订单审核
-export function OrderCardStatus(data) {
-    return service.post("/admin/sim/applyAudit", data);
-}
-
-// 上传订单合同
-export function UploadOrderCardContract(data) {
-    return service.post("/admin/sim/uploadContract", data);
-}
-
-// 购卡
-export function CardPurchase(data) {
-    return service.post('/admin/sim/apply', data)
-}
-
-// 分配卡号
-export function DistributionCard(data) {
-    return service.post("/admin/sim/assignSim", data);
-}
-
-// 查看订单下的卡
-export function viewOrderCard(params) {
-    return service.get("/admin/sim/orderCard", { params });
-}
-
-// 获取资费
-export function AcquireOrdertariff(params) {
-    return service.get("/admin/platform/getTariffById", { params });
-}
-
-// 获取资费下的卡
-export function TariffOrderCard(params) {
-    return service.get("/admin/platform/getTariffCard", { params });
-}
-
-// 退卡
-export function ReturntheCard(data) {
-    return service.post("/admin/sim/returnCard", data);
-}
-
-// 获取购卡订单下的卡
-export function ReturntheOrderCard(params) {
-    return service.get('/admin/sim/orderCard', { params })
-}
-
-// 设置金额
-export function SettingPricing(data) {
-    return service.post('/admin/sim/setAmount', data)
-}
-
-// 获取导卡进度
-export function GuideCardProgress(params){
-    return service.get('/admin/sim/assignProgress', { params});
-}

+ 0 - 27
src/api/path/purchase.js

@@ -1,27 +0,0 @@
-import service from '../../utils/axios'
-
-// 采购订单分页查询
-export function purchaseOrderList(param) {
-    return service.post('/admin/sim/applyList', param)
-}
-
-// 订购生成订单
-export function addPurchaseOrder(param) {
-    return service.post('/admin/sim/createOrder', param)
-}
-
-// 订单订购状态修改-客户端
-export function adminUpdate(params) {
-    return service.get("/admin/sim/orderStatusUpdate", { params });
-}
-
-// 平台
-export function platformUpdate(params) {
-    return service.get("/admin/sim/orderModeration", { params });
-}
-
-
-// 退卡
-export function cancelOrderList(params) {
-    return service.post("/admin/sim/returnCardList", params);
-}

+ 0 - 6
src/api/path/renewalOrder.js

@@ -1,6 +0,0 @@
-import service from '../../utils/axios'
-
-// 续费订单信息
-export function RenewalOrderInformation(data) {
-    return service.post('/admin/platform/getTrafficOrderList', data)
-}

+ 0 - 20
src/api/path/star.api.js

@@ -1,20 +0,0 @@
-
-import service from '../../utils/axios'
-
-// 分销商
-// 新增
-export function distributorAdd(param) {
-  return service.post('/admin/star/setItem', param)
-}
-// list
-export function distributorList(param) {
-  return service.post('/admin/star/list', param)
-}
-// 编辑
-export function distributorEdit(param) {
-  return service.post('/admin/star/update', param)
-}
-// 删除
-export function distributorDelete(param) {
-  return service.post('/admin/star/delete', param)
-}

+ 0 - 71
src/api/path/tariffManagement.api.js

@@ -1,71 +0,0 @@
-import service from '../../utils/axios'
-
-// 查询资费计划
-export function tariffList(param) {
-    return service.post('/admin/platform/tariffList', param)
-}
-
-// 添加资费计划
-export function addTariff(param) {
-    return service.post('/admin/platform/addTariff', param)
-}
-
-// 更新资费计划
-export function updateTariff(param) {
-    return service.post('/admin/platform/updateTariff', param)
-}
-
-// 删除资费计划
-export function deleteTariff(params) {
-    return service.get('/admin/platform/deleteTariff', { params })
-}
-
-// 添加资费套餐
-export function addTariffPackage(data) {
-    return service.post('/admin/platform/addTariffProduct', data)
-}
-
-// 查询资费商品
-export function CheckTariffPackages(data) {
-    return service.post('/admin/platform/tariffProductList', data)
-}
-
-// 更新资费商品
-export function UpdateTariffTtems(data) {
-    return service.post('/admin/platform/updateTariffProduct', data)
-}
-
-// 删除资费商品
-export function DeleteTariffItems(params) {
-    return service.get('/admin/platform/deleteTariffProduct', { params })
-}
-
-// 查询客户下的流量池
-export function ExampleQueryTrafficPool() {
-    return service.get('/admin/platform/customerTrafficPool')
-}
-
-// 资费有效期
-export function tariiffManageDate(data) {
-    return service.post('/admin/platform/renewTariff', data)
-}
-
-// 修改资费名称
-export function UpdateTariffName(data) {
-    return service.post('/admin/platform/updateTariffName', data)
-}
-
-// 套餐计划表
-export function PackageSchedule(data){
-    return service.post('/admin/platform/tariffPlanList', data)
-}
-
-// 添加套餐计划
-export function addTariffSchedule(data){
-    return service.post('/admin/platform/addTariffPlan', data)
-}
-
-// 套餐上下架
-export function PackageTakedown(data){
-    return service.post('/admin/platform/UpdateTariffPlan', data)
-}

+ 0 - 157
src/components/Form/index.vue

@@ -1,157 +0,0 @@
-<template>
-  <a-form ref="formRef" :model="formData" :rules="formRules" @submit="handleSubmit">
-    <template v-for="(item, index) in formConfig" :key="`field-${index}`">
-      <a-col :span="item.layout === 1 ? 24 : 12" v-if="showField(item)">
-        <a-form-item :label="item.label" :rules="item.rules" :field="item.field"
-          :validate-trigger="rulesTagse(item?.rules)">
-          <component :is="'a-' + item.type" v-model="formData[item.field]" v-bind="item.props"
-            @change="(e) => handelChange(e, item)">
-            <template v-if="item.type == 'select'">
-              <a-option v-for="option in item.options" :key="option.value" :value="option.value">
-                {{ option.label }}
-              </a-option>
-            </template>
-            <!-- 渲染插槽 必须先渲染一次 在传递给父组件 不然为空 -->
-            <template v-if="item.slot" #[item.slot]>
-              <slot :name="item.slot" :item="item"></slot>
-            </template>
-          </component>
-        </a-form-item>
-      </a-col>
-    </template>
-    <a-form-item>
-      <a-button type="primary" html-type="submit">提交</a-button>
-    </a-form-item>
-  </a-form>
-</template>
-
-<script setup>
-import { ref, defineProps, toRefs, defineEmits, onMounted, watchEffect } from 'vue';
-import service from '@/utils/axios.js'
-import { Getdictionary } from '@/mixins/index'
-
-// 使用
-// const formConfig = [
-//   {
-//     field: 'username',
-//     type: 'input',
-//     label: '用户名',
-//     value: '',
-//     rules: [
-//       { required: true, message: '请输入用户名', trigger: 'blur' },
-//     ],
-//   },
-//   {
-//     field: 'gender',
-//     type: 'select',
-//     label: '性别',
-//     value: '',
-//     options: [],
-//     dict: 'cardType',
-//     isVisible:false
-//   },
-//   {
-//     field: 'a',
-//     type: 'select',
-//     label: '6666',
-//     value: '',
-//     options: [],
-//     isVisible: async (item, e) => {
-//       return e.gender == 1
-//     }
-//   }
-// ];
-const props = defineProps({
-  formConfig: {
-    type: Array,
-    required: true, // 传入字段配置
-  },
-
-});
-const emits = defineEmits(['submit', 'change']);
-
-const { formConfig } = toRefs(props)
-
-const formData = ref({}); // 存储表单数据
-const formRules = ref({}); // 存储表单验证规则
-const visibilityCache = ref({}); // 缓存每个字段的可见性状态
-
-const isVisibleShow = async (item, formData) => {
-  if (item && item.isVisible) {
-    if (typeof item.isVisible === 'function') {
-      const result = await item.isVisible(item, formData);
-      visibilityCache.value[item.field] = result;
-      return result;
-    } else {
-      visibilityCache.value[item.field] = item.isVisible;
-      return item.isVisible;
-    }
-  }
-  return true;
-};
-
-const showField = (item) => {
-  return visibilityCache.value[item.field] !== false;
-};
-
-// 加载字典数据
-const loadDictOptions = async (index, dict, api) => {
-  if (dict) {
-    const res = await Getdictionary(dict);
-    formConfig.value[index].options = res
-  }
-  if (api) {
-    const res = await service[api.method](api.url, api.data || {});
-    if (res.code === 200) {
-      formConfig.value[index].options = res.data
-    }
-  }
-};
-
-const handelChange = async (e, item) => {
-  emits('change', e)
-  await isVisibleShow(item, formData.value)
-}
-
-// 表单提交方法
-const handleSubmit = () => {
-  emits('submit', formData.value)
-};
-
-const rulesTagse = (item) => {
-  if (!item) return ''
-  return item[0]?.trigger
-}
-
-onMounted(async () => {
-  // 初始化所有字段的可见性状态
-  for (const item of formConfig.value) {
-    await isVisibleShow(item, formData.value);
-  }
-
-  formConfig.value.forEach(async (res, key) => {
-    if (res.dict) {
-      await loadDictOptions(key, res.dict); // 加载字典数据
-    }
-    if (res.api) {
-      await loadDictOptions(key, false, res.api); // 加载字典数据
-    }
-  })
-  // 初始化 formData 和 formRules
-  formData.value = formConfig.value.reduce((acc, item) => {
-    acc[item.field] = item.value || ''; // 使用传入的 value 或空字符串
-    return acc;
-  }, {});
-
-  // 初始化 formRules
-  formRules.value = formConfig.value.reduce((acc, item) => {
-    if (item.rules) {
-      acc[item.field] = item.rules; // 根据传入的 rules 初始化验证规则
-    }
-    return acc;
-  }, {});
-})
-
-</script>
-
-<style scoped></style>

+ 0 - 290
src/components/Layout/components/layout/components/HongKong.vue

@@ -1,290 +0,0 @@
-<template>
-    <a-layout style="min-height: 100vh">
-        <a-layout-sider :width="240" :collapsed-width="50" collapsible :trigger="null" @collapse="evMenuSecondLongShow"
-            v-model:collapsed="menuSecondLongShow">
-            <div class="logo-layout">
-                <div class="logo">
-                    <img src="@/assets/images/logo_set.png" style="height: 46px; " />
-                    <h3 v-if="!menuSecondLongShow" style="margin-left: 10px;">FlexiStream</h3>
-                </div>
-            </div>
-
-            <a-menu v-model:selectedKeys="routeItemSelectedKeys" @mouseleave="evMouseleaveMenu">
-                <a-sub-menu v-for="routeItem in routesData" :key="routeItem.name">
-                    <template #icon>
-                        <svg-icon :icon="routeItem.meta.icon"></svg-icon>
-                    </template>
-                    <template #title>{{ routeItem.meta.title }}</template>
-                    <template v-for="item in routeItem?.children || []">
-                        <a-menu-item v-if="!item.children || item.children.length === 0" :key="item.name?.toString()"
-                            @click="evGoPage(item)">
-                            <span class="menu-level-font">{{ item.meta.title }}</span>
-                        </a-menu-item>
-                        <template v-else-if="item.children && item.children.length > 0">
-                            <sub-menu :key="item.name" :menu-info="item" @go="evGoPage" />
-                        </template>
-                    </template>
-                </a-sub-menu>
-            </a-menu>
-        </a-layout-sider>
-
-        <a-layout>
-            <a-layout-header class="layout-header">
-                <LayoutHeader />
-            </a-layout-header>
-            <a-layout>
-                <main class="layout-content-main">
-                    <router-view v-slot="{ Component }" class="layout-content-router">
-                        <component :is="Component" key="Layout" />
-                    </router-view>
-                </main>
-            </a-layout>
-        </a-layout>
-    </a-layout>
-</template>
-<script setup>
-import { ref, computed, h, reactive, onMounted, watch, nextTick } from "vue";
-import { useRoute, useRouter } from "vue-router";
-import { useSystemStore } from "@/store/modules/systemStore";
-import LayoutHeader from "@/components/Layout/components/layoutHeader/index.vue";
-import subMenu from "@/components/Layout/components/subMenu/index.vue";
-import { RouterTagData } from '@/store/modules/routerTag.js'
-
-// 标签页仓库
-const settingStore = RouterTagData()
-
-const systemStore = useSystemStore();
-
-const route = useRoute();
-const router = useRouter();
-
-const menuSecondLongShow = ref(systemStore.menuSecondLongShow);
-// 主菜单
-const routesData = router.options.routes[0]?.children || [];
-
-const menuTabSate = ref([systemStore.getMenuTabSate || routesData[0].name]);
-//子菜单
-const menuSecondData = ref(systemStore.getRouteItem);
-// 选中的状态路由列表
-const menuSecondSelectedStatusData = ref(systemStore.getRouteItem);
-const routeItemSelectedKeys = ref();
-
-const evMenuSecondLongShow = () => {
-    systemStore.setStateValue({
-        key: "menuSecondLongShow",
-        value: menuSecondLongShow.value ? 1 : 0,
-        localStorage: true,
-    });
-};
-const evMouseleaveMenu = (e) => {
-    if (
-        e.relatedTarget?.offsetParent?.id &&
-        e.relatedTarget?.offsetParent?.id == "layout-sider"
-    )
-        return;
-    menuSecondData.value = menuSecondSelectedStatusData.value;
-};
-// 子菜单
-const evMouseLeavesSubMenu = () => {
-    menuSecondData.value = menuSecondSelectedStatusData.value;
-};
-// 鼠标滑动上去更新菜单栏 目前先屏蔽
-const evMenuGetFn = (routeItem, type) => {
-    if (menuSecondLongShow.value) {
-        menuSecondData.value = routeItem;
-    }
-};
-
-// 查找最下级
-const findPath = (data) => {
-    if (data.children && data.children.length > 0) {
-        return findPath(data.children[0]);
-    } else {
-        return data;
-    }
-};
-
-// 主路由 状态
-const changeRoutesItems = (e) => {
-    const item = findPath(e);
-    evGoPage(item);
-};
-
-// 跳转路由
-const evGoPage = async (routeItem) => {
-    // settingStore.tagsPushData(routeItem);
-    await router.push({
-        name: routeItem.name,
-    });
-    menuTabSate.value = [route.matched[1].name];
-    systemStore.setStateValue({
-        key: "menuTabSate",
-        value: menuTabSate.value[0] || "",
-        localStorage: true,
-    });
-
-    menuSecondSelectedStatusData.value = routesData.find(
-        (item) => item.name == menuTabSate.value
-    );
-    menuSecondData.value = menuSecondSelectedStatusData.value;
-    systemStore.setStateValue({
-        key: "routeItem",
-        value: JSON.stringify(menuSecondData.value),
-        localStorage: true,
-    });
-};
-
-watch(
-    route,
-    (val) => {
-        if (val.name) {
-            routeItemSelectedKeys.value = [val.name];
-            console.log(routesData);
-        }
-    },
-    { immediate: true }
-);
-</script>
-<style scoped lang="less">
-.layout-header {
-    height: 48px;
-    background: @bg_color_2;
-    // padding-inline: 10px;
-    box-shadow: 0 1px 4px rgba(0, 21, 41, 0.08);
-    z-index: 9;
-}
-
-.ant-layout-content {
-    height: auto;
-    min-height: auto;
-    overflow-y: auto;
-    padding: 0 20px;
-}
-
-.layout-content-main {
-    flex: 1;
-    padding: 0 1.2rem 1.6rem 1.2rem;
-    margin: 1.1rem 0 0rem 0;
-    overflow-y: auto;
-    overflow: overlay;
-    height: 95%;
-    display: flex;
-    flex-wrap: wrap;
-}
-
-.logo-layout {
-    height: 64px;
-    color: #fff;
-    display: flex;
-    align-items: center;
-    justify-content: center;
-    background: #0f2d5c;
-
-    .logo {
-        width: 100%;
-        height: 32px;
-        display: flex;
-        justify-content: center;
-        align-items: center;
-
-        h3 {
-            white-space: nowrap;
-        }
-    }
-}
-
-.arco-layout {
-    color: @text_color_1;
-    background: @layout-split-color !important;
-    overflow: hidden;
-}
-
-:deep(.arco-menu-light) {
-    background-color: #0f2d5c;
-
-    .arco-menu-item {
-        color: #fff;
-        background: #0f2d5c;
-    }
-}
-
-:deep(.arco-layout-sider-light) {
-    background-color: #0f2d5c;
-}
-
-:deep(.arco-menu-inline-header) {
-    font-weight: 600;
-    color: @text_color_1;
-    background-color: @bg_color_3;
-}
-
-:deep(.layout-content-router) {
-    padding: 0 1rem 1rem 1rem;
-    background-color: @bg_color_4;
-    box-sizing: border-box;
-    width: 100%;
-}
-
-:deep(.arco-menu-inline-content) {
-    .arco-menu-selected {
-        color: @text_color_1;
-        background-color: @black_3;
-
-        &:after {
-            content: none;
-        }
-    }
-}
-
-#layout-sider {
-    :deep(.arco-menu-selected) {
-        color: @text_color_1 !important;
-        font-weight: bold;
-        background-color: @black_3;
-
-        .arco-icon {
-            color: @text_color_1 !important;
-        }
-
-        &:hover {
-            background-color: rgba(235, 19, 19, 0.1) !important;
-        }
-    }
-
-    :deep(.arco-menu-inline) {
-        .arco-menu-inline-header {
-            background-color: @bg_color_3;
-            padding-left: 20px;
-            left: 5px;
-
-            svg {
-                color: @text_color_1 !important;
-                font-size: 14px;
-            }
-
-            .arco-menu-icon-suffix {
-                color: @text_color_1 !important;
-                left: 0px !important;
-                right: auto;
-            }
-
-            &:hover {
-                background-color: rgba(255, 255, 255, 0) !important;
-            }
-        }
-
-        .arco-menu-item {
-            padding: 0 5px;
-        }
-    }
-
-    :deep(.arco-menu-item) {
-        padding-left: 24px;
-    }
-}
-
-:deep(.arco-layout-sider-trigger-light){
-    background-color: #0f2d5c;
-    color: #fff;
-}
-</style>

+ 0 - 295
src/components/Layout/components/layout/components/Thailand.vue

@@ -1,295 +0,0 @@
-<template>
-    <a-layout style="min-height: 100vh">
-      <a-layout-sider theme="dark" :width="160" :collapsed-width="50" collapsible :trigger="null"
-        @collapse="evMenuSecondLongShow" v-model:collapsed="menuSecondLongShow">
-        <div class="logo-layout">
-          <div class="logo">
-            <img src="@/assets/images/logo.png" style="height: 26px; width: 26px;" />
-            <h3 v-if="!menuSecondLongShow" style="margin-left: 10px;"> Easy life</h3>
-          </div>
-        </div>
-  
-        <a-menu v-model:selectedKeys="menuTabSate" theme="dark" mode="inline" @mouseleave="evMouseleaveMenu">
-          <a-menu-item v-for="routeItem in routesData" :key="routeItem.name"
-            @mouseenter="evMenuGetFn(routeItem, 'mouseenter')" @click="changeRoutesItems(routeItem)">
-            <template #icon>
-              <svg-icon :icon="routeItem.meta.icon"></svg-icon>
-            </template>
-            <span>{{ routeItem.meta.title }}</span>
-          </a-menu-item>
-        </a-menu>
-      </a-layout-sider>
-  
-      <a-layout>
-        <a-layout-header class="layout-header">
-          <LayoutHeader />
-        </a-layout-header>
-        <a-layout>
-          <a-layout-sider id="layout-sider" :collapsed="false" :width="menuSecondData &&
-            menuSecondData.children &&
-            menuSecondData.children.length > 0
-            ? 160
-            : 0
-            " @mouseleave="evMouseLeavesSubMenu">
-            <a-menu :selectedKeys="routeItemSelectedKeys" id="layout-sider" theme="light" mode="vertical"
-              :collapsed="false" :auto-open="true">
-              <template v-for="routeItem in menuSecondData?.children || []">
-                <a-menu-item v-if="!routeItem.children || routeItem.children.length === 0"
-                  :key="routeItem.name?.toString()" @click="evGoPage(routeItem)">
-                  <span class="menu-level-font">{{ routeItem.meta.title }}</span>
-                </a-menu-item>
-  
-                <template v-else-if="routeItem.children && routeItem.children.length > 0">
-                  <sub-menu :key="routeItem.name" :menu-info="routeItem" @go="evGoPage" />
-                </template>
-              </template>
-            </a-menu>
-          </a-layout-sider>
-  
-          <main class="layout-content-main">
-            <router-view v-slot="{ Component }" class="layout-content-router">
-              <component :is="Component" key="Layout" />
-            </router-view>
-          </main>
-        </a-layout>
-      </a-layout>
-    </a-layout>
-  </template>
-  <script setup>
-  import { ref, computed, h, reactive, onMounted, watch, nextTick } from "vue";
-  import { useRoute, useRouter } from "vue-router";
-  import { useSystemStore } from "@/store/modules/systemStore";
-  import LayoutHeader from "@/components/Layout/components/layoutHeader/index.vue";
-  import subMenu from "@/components/Layout/components/subMenu/index.vue";
-  import { RouterTagData } from '@/store/modules/routerTag.js'
-  
-  // 标签页仓库
-  const settingStore = RouterTagData()
-  
-  const systemStore = useSystemStore();
-  
-  const route = useRoute();
-  const router = useRouter();
-  
-  const menuSecondLongShow = ref(systemStore.menuSecondLongShow);
-  // 主菜单
-  const routesData = router.options.routes[0]?.children || [];
-  
-  const menuTabSate = ref([systemStore.getMenuTabSate || routesData[0].name]);
-  //子菜单
-  const menuSecondData = ref(systemStore.getRouteItem);
-  // 选中的状态路由列表
-  const menuSecondSelectedStatusData = ref(systemStore.getRouteItem);
-  const routeItemSelectedKeys = ref();
-  
-  const evMenuSecondLongShow = () => {
-    systemStore.setStateValue({
-      key: "menuSecondLongShow",
-      value: menuSecondLongShow.value ? 1 : 0,
-      localStorage: true,
-    });
-  };
-  const evMouseleaveMenu = (e) => {
-    if (
-      e.relatedTarget?.offsetParent?.id &&
-      e.relatedTarget?.offsetParent?.id == "layout-sider"
-    )
-      return;
-    menuSecondData.value = menuSecondSelectedStatusData.value;
-  };
-  // 子菜单
-  const evMouseLeavesSubMenu = () => {
-    menuSecondData.value = menuSecondSelectedStatusData.value;
-  };
-  // 鼠标滑动上去更新菜单栏 目前先屏蔽
-  const evMenuGetFn = (routeItem, type) => {
-    if (menuSecondLongShow.value) {
-      menuSecondData.value = routeItem;
-    }
-  };
-  
-  // 查找最下级
-  const findPath = (data) => {
-    if (data.children && data.children.length > 0) {
-      return findPath(data.children[0]);
-    } else {
-      return data;
-    }
-  };
-  
-  // 主路由 状态
-  const changeRoutesItems = (e) => {
-    const item = findPath(e);
-    evGoPage(item);
-  };
-  
-  // 跳转路由
-  const evGoPage = async (routeItem) => {
-    // settingStore.tagsPushData(routeItem);
-    await router.push({
-      name: routeItem.name,
-    });
-    menuTabSate.value = [route.matched[1].name];
-    systemStore.setStateValue({
-      key: "menuTabSate",
-      value: menuTabSate.value[0] || "",
-      localStorage: true,
-    });
-  
-    menuSecondSelectedStatusData.value = routesData.find(
-      (item) => item.name == menuTabSate.value
-    );
-    menuSecondData.value = menuSecondSelectedStatusData.value;
-    systemStore.setStateValue({
-      key: "routeItem",
-      value: JSON.stringify(menuSecondData.value),
-      localStorage: true,
-    });
-  };
-  
-  watch(
-    route,
-    (val) => {
-      if (val.name) {
-        routeItemSelectedKeys.value = [val.name];
-      }
-    },
-    { immediate: true }
-  );
-  </script>
-  <style scoped lang="less">
-  .layout-header {
-    height: 48px;
-    background: @bg_color_2;
-    // padding-inline: 10px;
-    box-shadow: 0 1px 4px rgba(0, 21, 41, 0.08);
-    z-index: 9;
-  }
-  
-  .ant-layout-content {
-    height: auto;
-    min-height: auto;
-    overflow-y: auto;
-    padding: 0 20px;
-  }
-  
-  .layout-content-main {
-    flex: 1;
-    padding: 0 1.2rem 1.6rem 1.2rem;
-    margin: 1.1rem 0 0rem 0;
-    overflow-y: auto;
-    overflow: overlay;
-    height: 95%;
-    display: flex;
-    flex-wrap: wrap;
-  }
-  
-  .logo-layout {
-    height: 64px;
-    color: #fff;
-    display: flex;
-    align-items: center;
-    justify-content: center;
-  
-    .logo {
-      width: 100%;
-      height: 32px;
-      display: flex;
-      justify-content: center;
-      align-items: center;
-  
-      h3 {
-        white-space: nowrap;
-      }
-    }
-  }
-  
-  .arco-layout {
-    color: @text_color_1;
-    background: @layout-split-color !important;
-    overflow: hidden;
-  }
-  
-  :deep(.arco-menu-light) {
-    background-color: @bg_color_3;
-  
-    .arco-menu-item {
-      background-color: @bg_color_3;
-    }
-  }
-  
-  :deep(.arco-layout-sider-light) {
-    background-color: @bg_color_3;
-  }
-  
-  :deep(.arco-menu-inline-header) {
-    font-weight: 600;
-    color: @text_color_1;
-    background-color: @bg_color_3;
-  }
-  
-  :deep(.layout-content-router) {
-    padding: 0 1rem 1rem 1rem;
-    background-color: @bg_color_4;
-    box-sizing: border-box;
-    width: 100%;
-  }
-  
-  :deep(.arco-menu-inline-content) {
-    .arco-menu-selected {
-      color: @text_color_1;
-      background-color: @black_3;
-  
-      &:after {
-        content: none;
-      }
-    }
-  }
-  
-  #layout-sider {
-    :deep(.arco-menu-selected) {
-      color: @text_color_1 !important;
-      font-weight: bold;
-      background-color: @black_3;
-  
-      .arco-icon {
-        color: @text_color_1 !important;
-      }
-  
-      &:hover {
-        background-color: rgba(235, 19, 19, 0.1) !important;
-      }
-    }
-  
-    :deep(.arco-menu-inline) {
-      .arco-menu-inline-header {
-        background-color: @bg_color_3;
-        padding-left: 20px;
-        left: 5px;
-  
-        svg {
-          color: @text_color_1 !important;
-          font-size: 14px;
-        }
-  
-        .arco-menu-icon-suffix {
-          color: @text_color_1 !important;
-          left: 0px !important;
-          right: auto;
-        }
-  
-        &:hover {
-          background-color: rgba(255, 255, 255, 0) !important;
-        }
-      }
-  
-      .arco-menu-item {
-        padding: 0 5px;
-      }
-    }
-  
-    :deep(.arco-menu-item) {
-      padding-left: 24px;
-    }
-  }
-  </style>

+ 290 - 8
src/components/Layout/components/layout/menu.vue

@@ -1,9 +1,291 @@
 <template>
-  <HongKong v-if="EnvTypeNum==1"/>
-  <Thailand v-if="EnvTypeNum==0"/>
-</template>
-<script setup>
-import { EnvTypeNum } from '@/settings/designSetting'
-import HongKong from './components/HongKong.vue'
-import Thailand from './components/Thailand.vue'
-</script>
+    <a-layout style="min-height: 100vh">
+      <a-layout-sider theme="dark" :width="160" :collapsed-width="50" collapsible :trigger="null"
+        @collapse="evMenuSecondLongShow" v-model:collapsed="menuSecondLongShow">
+        <div class="logo-layout">
+          <div class="logo">
+            <img src="@/assets/images/logo.png" style="height: 26px; width: 26px;" />
+            <h3 v-if="!menuSecondLongShow" style="margin-left: 10px;"> Easy life</h3>
+          </div>
+        </div>
+  
+        <a-menu v-model:selectedKeys="menuTabSate" theme="dark" mode="inline" @mouseleave="evMouseleaveMenu">
+          <a-menu-item v-for="routeItem in routesData" :key="routeItem.name"
+            @mouseenter="evMenuGetFn(routeItem, 'mouseenter')" @click="changeRoutesItems(routeItem)">
+            <template #icon>
+              <svg-icon :icon="routeItem.meta.icon"></svg-icon>
+            </template>
+            <span>{{ routeItem.meta.title }}</span>
+          </a-menu-item>
+        </a-menu>
+      </a-layout-sider>
+  
+      <a-layout>
+        <a-layout-header class="layout-header">
+          <LayoutHeader />
+        </a-layout-header>
+        <a-layout>
+          <a-layout-sider id="layout-sider" :collapsed="false" :width="menuSecondData &&
+            menuSecondData.children &&
+            menuSecondData.children.length > 0
+            ? 160
+            : 0
+            " @mouseleave="evMouseLeavesSubMenu">
+            <a-menu :selectedKeys="routeItemSelectedKeys" id="layout-sider" theme="light" mode="vertical"
+              :collapsed="false" :auto-open="true">
+              <template v-for="routeItem in menuSecondData?.children || []">
+                <a-menu-item v-if="!routeItem.children || routeItem.children.length === 0"
+                  :key="routeItem.name?.toString()" @click="evGoPage(routeItem)">
+                  <span class="menu-level-font">{{ routeItem.meta.title }}</span>
+                </a-menu-item>
+  
+                <template v-else-if="routeItem.children && routeItem.children.length > 0">
+                  <sub-menu :key="routeItem.name" :menu-info="routeItem" @go="evGoPage" />
+                </template>
+              </template>
+            </a-menu>
+          </a-layout-sider>
+  
+          <main class="layout-content-main">
+            <router-view v-slot="{ Component }" class="layout-content-router">
+              <component :is="Component" key="Layout" />
+            </router-view>
+          </main>
+        </a-layout>
+      </a-layout>
+    </a-layout>
+  </template>
+  <script setup>
+  import { ref, computed, h, reactive, onMounted, watch, nextTick } from "vue";
+  import { useRoute, useRouter } from "vue-router";
+  import { useSystemStore } from "@/store/modules/systemStore";
+  import LayoutHeader from "@/components/Layout/components/layoutHeader/index.vue";
+  import subMenu from "@/components/Layout/components/subMenu/index.vue";
+  
+  const systemStore = useSystemStore();
+  
+  const route = useRoute();
+  const router = useRouter();
+  
+  const menuSecondLongShow = ref(systemStore.menuSecondLongShow);
+  // 主菜单
+  const routesData = router.options.routes[0]?.children || [];
+  
+  const menuTabSate = ref([systemStore.getMenuTabSate || routesData[0].name]);
+  //子菜单
+  const menuSecondData = ref(systemStore.getRouteItem);
+  // 选中的状态路由列表
+  const menuSecondSelectedStatusData = ref(systemStore.getRouteItem);
+  const routeItemSelectedKeys = ref();
+  
+  const evMenuSecondLongShow = () => {
+    systemStore.setStateValue({
+      key: "menuSecondLongShow",
+      value: menuSecondLongShow.value ? 1 : 0,
+      localStorage: true,
+    });
+  };
+  const evMouseleaveMenu = (e) => {
+    if (
+      e.relatedTarget?.offsetParent?.id &&
+      e.relatedTarget?.offsetParent?.id == "layout-sider"
+    )
+      return;
+    menuSecondData.value = menuSecondSelectedStatusData.value;
+  };
+  // 子菜单
+  const evMouseLeavesSubMenu = () => {
+    menuSecondData.value = menuSecondSelectedStatusData.value;
+  };
+  // 鼠标滑动上去更新菜单栏 目前先屏蔽
+  const evMenuGetFn = (routeItem, type) => {
+    if (menuSecondLongShow.value) {
+      menuSecondData.value = routeItem;
+    }
+  };
+  
+  // 查找最下级
+  const findPath = (data) => {
+    if (data.children && data.children.length > 0) {
+      return findPath(data.children[0]);
+    } else {
+      return data;
+    }
+  };
+  
+  // 主路由 状态
+  const changeRoutesItems = (e) => {
+    const item = findPath(e);
+    evGoPage(item);
+  };
+  
+  // 跳转路由
+  const evGoPage = async (routeItem) => {
+    // settingStore.tagsPushData(routeItem);
+    await router.push({
+      name: routeItem.name,
+    });
+    menuTabSate.value = [route.matched[1].name];
+    systemStore.setStateValue({
+      key: "menuTabSate",
+      value: menuTabSate.value[0] || "",
+      localStorage: true,
+    });
+  
+    menuSecondSelectedStatusData.value = routesData.find(
+      (item) => item.name == menuTabSate.value
+    );
+    menuSecondData.value = menuSecondSelectedStatusData.value;
+    systemStore.setStateValue({
+      key: "routeItem",
+      value: JSON.stringify(menuSecondData.value),
+      localStorage: true,
+    });
+  };
+  
+  watch(
+    route,
+    (val) => {
+      if (val.name) {
+        routeItemSelectedKeys.value = [val.name];
+      }
+    },
+    { immediate: true }
+  );
+  </script>
+  <style scoped lang="less">
+  .layout-header {
+    height: 48px;
+    background: @bg_color_2;
+    // padding-inline: 10px;
+    box-shadow: 0 1px 4px rgba(0, 21, 41, 0.08);
+    z-index: 9;
+  }
+  
+  .ant-layout-content {
+    height: auto;
+    min-height: auto;
+    overflow-y: auto;
+    padding: 0 20px;
+  }
+  
+  .layout-content-main {
+    flex: 1;
+    padding: 0 1.2rem 1.6rem 1.2rem;
+    margin: 1.1rem 0 0rem 0;
+    overflow-y: auto;
+    overflow: overlay;
+    height: 95%;
+    display: flex;
+    flex-wrap: wrap;
+  }
+  
+  .logo-layout {
+    height: 64px;
+    color: #fff;
+    display: flex;
+    align-items: center;
+    justify-content: center;
+  
+    .logo {
+      width: 100%;
+      height: 32px;
+      display: flex;
+      justify-content: center;
+      align-items: center;
+  
+      h3 {
+        white-space: nowrap;
+      }
+    }
+  }
+  
+  .arco-layout {
+    color: @text_color_1;
+    background: @layout-split-color !important;
+    overflow: hidden;
+  }
+  
+  :deep(.arco-menu-light) {
+    background-color: @bg_color_3;
+  
+    .arco-menu-item {
+      background-color: @bg_color_3;
+    }
+  }
+  
+  :deep(.arco-layout-sider-light) {
+    background-color: @bg_color_3;
+  }
+  
+  :deep(.arco-menu-inline-header) {
+    font-weight: 600;
+    color: @text_color_1;
+    background-color: @bg_color_3;
+  }
+  
+  :deep(.layout-content-router) {
+    padding: 0 1rem 1rem 1rem;
+    background-color: @bg_color_4;
+    box-sizing: border-box;
+    width: 100%;
+  }
+  
+  :deep(.arco-menu-inline-content) {
+    .arco-menu-selected {
+      color: @text_color_1;
+      background-color: @black_3;
+  
+      &:after {
+        content: none;
+      }
+    }
+  }
+  
+  #layout-sider {
+    :deep(.arco-menu-selected) {
+      color: @text_color_1 !important;
+      font-weight: bold;
+      background-color: @black_3;
+  
+      .arco-icon {
+        color: @text_color_1 !important;
+      }
+  
+      &:hover {
+        background-color: rgba(235, 19, 19, 0.1) !important;
+      }
+    }
+  
+    :deep(.arco-menu-inline) {
+      .arco-menu-inline-header {
+        background-color: @bg_color_3;
+        padding-left: 20px;
+        left: 5px;
+  
+        svg {
+          color: @text_color_1 !important;
+          font-size: 14px;
+        }
+  
+        .arco-menu-icon-suffix {
+          color: @text_color_1 !important;
+          left: 0px !important;
+          right: auto;
+        }
+  
+        &:hover {
+          background-color: rgba(255, 255, 255, 0) !important;
+        }
+      }
+  
+      .arco-menu-item {
+        padding: 0 5px;
+      }
+    }
+  
+    :deep(.arco-menu-item) {
+      padding-left: 24px;
+    }
+  }
+  </style>

+ 0 - 161
src/components/Search/index.vue

@@ -1,161 +0,0 @@
-<template>
-    <div class="search">
-        <!-- 动态渲染表单项 -->
-        <div class="Form">
-            <a-form :model="formState" layout="inline">
-                <a-form-item v-for="(item, index) in showIcon ? data : InitialData" :key="index" :label="item.label"
-                    :field="item.field" :wrapper-col-style="{ marginBottom: '20px' }">
-                    <component :is="'a-' + item.type" v-model="formState[item.field]" item.Custom
-                        :placeholder="item.type == 'input' ? '请输入' : '请选择' + item.label" allow-clear
-                        :style="{ width: item.width ? item.width + 'px' : '' }">
-                        <template v-if="item.type == 'select'">
-                            <a-option v-for="option in item.options" :key="option.value" :value="option.value">
-                                {{ option.label }}
-                            </a-option>
-                        </template>
-                    </component>
-                </a-form-item>
-                <a-form-item>
-                    <a-button type="primary" @click="handleQuery">查询</a-button>
-                    <a-button @click="handleReset" style="margin-left: 10px;">重置</a-button>
-                    <div v-if="show" @click="showIcon = !showIcon" class="icon">
-                        {{ showIcon ? '折叠' : '展开' }} <icon-down :rotate="showIcon ? 180 : 0" />
-                    </div>
-                </a-form-item>
-            </a-form>
-        </div>
-    </div>
-</template>
-
-<script setup>
-import { ref, defineProps, toRefs, watch, defineEmits } from 'vue';
-import { Getdictionary } from "@/mixins/index.js";
-
-// 接收 props
-const props = defineProps({
-    SearchForm: {
-        type: Array,
-        default: () => [
-            {
-                type: 'input',
-                label: '字典名称',
-                field: 'source',
-                value: '',
-            },
-            {
-                type: 'input',
-                label: '资费ID',
-                field: 'trafficId',
-                value: '',
-            },
-            {
-                type: 'select',
-                label: '卡类型',
-                field: 'simType',
-                options: [],
-                dict: 'CardType',
-                value: '',
-                width: '200'
-            },
-        ],
-    },
-});
-
-const { SearchForm } = toRefs(props);
-
-// 用于存储原始SearchForm数据的副本
-const originalSearchForm = ref([]);
-// 分割完成的数据
-const InitialData = ref([]);
-const show = ref(false);
-const showIcon = ref(false);
-const formState = ref({});
-const data = ref([]);
-
-const emit = defineEmits(['query']);
-
-// 在组件创建时,拷贝原始SearchForm数据
-watch(() => props.SearchForm, () => {
-    originalSearchForm.value = JSON.parse(JSON.stringify(props.SearchForm));
-}, { immediate: true });
-
-SearchForm.value.forEach(item => {
-    formState.value[item.field] = item.value;
-});
-
-// 字典加载
-const loadedDicts = ref({});
-const loadDictOptions = async (index, dict) => {
-    if (loadedDicts.value[dict]) {
-        SearchForm.value[index].options = loadedDicts.value[dict];
-        return;
-    }
-    const dictionary = await Getdictionary(dict);
-    loadedDicts.value[dict] = dictionary || [];
-    SearchForm.value[index].options = loadedDicts.value[dict];
-    originalSearchForm.value[index].options = loadedDicts.value[dict];
-};
-
-watch(
-    () => SearchForm.value,
-    async () => {
-        for (let index = 0; index < SearchForm.value.length; index++) {
-            const item = SearchForm.value[index];
-            if (item.dict && !loadedDicts.value[item.dict]) {
-                await loadDictOptions(index, item.dict);
-            }
-        }
-        // 如果当前长度超过5条就需要折叠展开
-        if (SearchForm.value.length >6) {
-            show.value = true;
-        }
-        // 初始化切割数组,使用原始SearchForm数据的副本进行操作
-        InitialData.value = originalSearchForm.value.splice(0, 6);
-        data.value = [...InitialData.value, ...originalSearchForm.value];
-    },
-    { immediate: true }
-);
-
-// 查询操作
-const handleQuery = () => {
-    emit('query', formState.value);
-};
-
-const handleReset = () => {
-    const newFormState = {};
-    SearchForm.value.forEach(item => {
-        if (typeof item.value === 'string') {
-            newFormState[item.field] = '';
-        } else if (Array.isArray(item.value)) {
-            newFormState[item.field] = [];
-        } else if (typeof item.value === 'object') {
-            newFormState[item.field] = {};
-        }
-    });
-    formState.value = newFormState;
-    emit('reset', formState.value);
-};
-
-
-</script>
-
-<style lang="less" scoped>
-.search {
-    display: flex;
-    justify-content: space-between;
-}
-
-.Form {
-    width: 95%;
-}
-
-.icon {
-    display: flex;
-    // align-items: center;
-    color: #3491fa;
-    font-size: 15px;
-    cursor: pointer;
-    font-weight: 600;
-    margin-left: 15px;
-}
-</style>

+ 0 - 73
src/components/Steps/StepButton.vue

@@ -1,73 +0,0 @@
-<template>
-    <div class="step-footer">
-        <a-space size="large">
-            <template v-if="isShowArray">
-                <a-button type="secondary" :disabled="current <= 1" @click="onPrev">
-                    <IconLeft /> 上一步
-                </a-button>
-                <a-button type="primary" :disabled="current >= maxStep" @click="onNext" v-if="maxStep !== current">
-                    下一步
-                    <IconRight />
-                </a-button>
-
-                <a-button type="primary" @click="onFinish" v-else>
-                    确认
-                </a-button>
-            </template>
-
-            <template v-if="!isShowArray">
-                <a-button type="primary" @click="onCancel">
-                    取消
-                </a-button>
-                <a-button type="primary" @click="onFinish">
-                    确认
-                </a-button>
-            </template>
-        </a-space>
-    </div>
-</template>
-
-<script setup>
-import { ref, defineEmits ,defineProps, toRefs } from 'vue';
-
-const emit = defineEmits(['onCancel', 'onSubmit']);
-
-const props = defineProps({
-    current: {
-        type: Number,
-        default: undefined,
-    },
-    maxStep: {
-        type: Number,
-        default: 1,
-    },
-    isShowArray: {
-        type: Boolean,
-        default: true,
-    },
-    onPrev: {
-        type: Function,
-        default: () => {},
-    },
-    onNext: {
-        type: Function,
-    }
-})
-
-const { current, maxStep, isShowArray, onPrev, onNext, onFinish } = toRefs(props);
-
-
-
-</script>
-
-
-<style lang="less" scoped>
-.step-footer {
-    width: 100%;
-    height: 200px;
-    text-align: center;
-    background: var(--color-bg-2);
-    color: #C2C7CC;
-    padding-top: 20px;
-}
-</style>

+ 0 - 126
src/components/Steps/StepForm.vue

@@ -1,126 +0,0 @@
-<template>
-    <!-- 动态渲染表单数据 -->
-    <template v-if="isShowArray">
-        <keep-alive>
-            <div class="steps-conter">
-                <div>
-                    <div v-for="(item, index) in StepsData[current - 1]" :key="item.id || item.field">
-                        <div v-show="visibleShowMap[item.field]">
-                            <a-form-item :label="item.label" :rules="item.rules" :field="item.field"
-                                :validate-trigger="rulesTagse(item?.rules)">
-                                <!-- 使用 key 触发重新渲染 -->
-                                <component :is="'a-' + item.type" v-model="formState[item.field]"
-                                    :placeholder="item.type === 'input' ? '请输入' : '请选择' + item.label" allow-clear
-                                    :style="{ width: item.width ? item.width + 'px' : '' }"
-                                    :key="formState[item.field]">
-                                    <template v-if="item.type === 'select'">
-                                        <a-option v-for="option in item.options" :key="option.value"
-                                            :value="option.value">
-                                            {{ option.label }}
-                                        </a-option>
-                                    </template>
-                                    <!-- 渲染插槽 必须先渲染一次 在传递给父组件 不然为空 -->
-                                    <template v-if="item.slot" #[item.slot]>
-                                        <slot :name="item.slot" :item="item"></slot>
-                                    </template>
-                                </component>
-                            </a-form-item>
-                        </div>
-                    </div>
-                </div>
-            </div>
-        </keep-alive>
-    </template>
-
-    <!-- 如果 StepsData 不是数组的格式,渲染单个表单项 -->
-    <template v-if="!isShowArray">
-        <component :is="'a-' + StepsData.type" v-model="StepsData.value"
-            :placeholder="StepsData.type === 'input' ? '请输入' : '请选择' + StepsData.label" allow-clear
-            :style="{ width: StepsData.width ? StepsData.width + 'px' : '' }">
-            <template v-if="StepsData.type === 'select'">
-                <a-option v-for="option in StepsData.options" :key="option.value" :value="option.value">
-                    {{ option.label }}
-                </a-option>
-            </template>
-            <!-- 渲染插槽 必须先渲染一次 在传递给父组件 不然为空 -->
-            <template v-if="item.slot" #[item.slot]>
-                <slot :name="item.slot" :item="item"></slot>
-            </template>
-        </component>
-    </template>
-</template>
-
-<script setup>
-import { ref, toRefs, defineProps, computed } from 'vue';
-const formState = ref({});
-const props = defineProps({
-    current: {
-        type: Number,
-        default: undefined,
-    },
-    StepsData: {
-        type: Number,
-        default: 1,
-    },
-    isShowArray: {
-        type: Boolean,
-        default: true,
-    },
-});
-
-const { current, StepsData, isShowArray } = toRefs(props)
-
-// 初始化 formState
-if (isShowArray.value) {
-    StepsData.value.forEach(step => {
-        step.forEach(item => {
-            if (item.field) {
-                formState.value[item.field] = item.value;
-            }
-        });
-    });
-} else if (StepsData.value && StepsData.value.value) {
-    formState.value = StepsData.value.value;
-}
-
-// 使用 computed 来动态计算每个表单项的可见性
-const visibleShowMap = computed(() => {
-    const visibilityMap = {};
-    // 遍历每个步骤,计算每个表单项的可见性
-    StepsData.value.forEach((step) => {
-        step.forEach((item) => {
-            if (item.field) {
-                if (item.isVisible) {
-                    if (typeof item.isVisible === 'function') {
-                        // 如果 isVisible 是函数,执行并设置结果
-                        visibilityMap[item.field] = item.isVisible(item, formState.value);
-                    } else {
-                        // 否则直接使用 isVisible 的值
-                        visibilityMap[item.field] = item.isVisible;
-                    }
-                } else {
-                    visibilityMap[item.field] = true;  // 默认可见
-                }
-            }
-        });
-    });
-
-    return visibilityMap;
-});
-
-
-
-// 表单验证方式
-const rulesTagse = (item) => {
-    if (!item) return ''
-    return item[0]?.trigger
-}
-
-</script>
-
-<style lang="less" scoped>
-.steps-conter {
-    width: 100%;
-    margin-top: 20px;
-}
-</style>

+ 0 - 121
src/components/Steps/index.vue

@@ -1,121 +0,0 @@
-<template>
-    <div>
-        <div class="header">
-            <a-button type="primary" @click="onCancel">
-                返回
-            </a-button>
-        </div>
-        <a-steps changeable :current="current" @change="setCurrent" label-placement="vertical">
-            <!-- 数组格式 -->
-            <template v-if="isShowArray">
-                <a-step v-for="(step, index) in StepsData" :key="index">
-                    第{{ index + 1 }}步
-                    <template #icon v-if="submitShow && current == (maxStep)">
-                        <icon-loading />
-                    </template>
-                </a-step>
-            </template>
-
-            <a-step>结果</a-step>
-        </a-steps>
-
-        <div class="form-container">
-            <div :style="{ width: width }">
-                <StepForm :StepsData="StepsData" :current="current" :isShowArray="isShowArray" />
-            </div>
-        </div>
-
-
-        <StepButton :current="current" :maxStep="maxStep" :isShowArray="isShowArray" :onPrev="onPrev" :onNext="onNext"
-            :onFinish="onFinish" />
-    </div>
-</template>
-
-<script setup>
-import { ref, defineProps, toRefs, computed, defineEmits } from 'vue';
-import StepButton from './StepButton.vue'
-import StepForm from './StepForm.vue'
-// const StepsData =
-const props = defineProps({
-    StepsData: {
-        type: Array,
-        default: () => [
-            [
-                {
-                    type: 'select', label: '姓名', field: 'name', value: '', options: [], isVisible: (item, e) => {
-                        if (e.gender == 'male') {
-                            item.options = [{ value: 'male', label: '男' }, { value: 'female', label: '女' }]
-                        }
-                        return e.gender == 'male'
-                    }
-                },
-                { type: 'select', label: '性别', field: 'gender', value: "", options: [{ value: 'male', label: '男' }, { value: 'female', label: '女' }] },
-            ],
-            [
-                { type: 'input', label: '年龄', field: 'age', value: '' },
-                { type: 'input', label: '电话', field: 'phone', value: '' },
-            ],
-        ]  // 默认值设置为数组套数组
-    }, // 步骤条数据层
-    width: {
-        type: [String, Number],
-        default: "50vw"
-    }
-});
-
-const emit = defineEmits(['step-change', 'onCancel', 'onSubmit']);
-
-const { StepsData, width } = toRefs(props);
-
-// 判断当前是否是数组套数组
-const isShowArray = computed(() => Array.isArray(StepsData.value));
-
-// 初始化表单状态
-
-const current = ref(1);
-const submitShow = ref(false)
-// 计算最大步骤数
-const maxStep = computed(() => (isShowArray.value ? StepsData.value.length : 1));
-
-// 上一步
-const onPrev = () => {
-    current.value = Math.max(1, current.value - 1);
-};
-
-// 下一步
-const onNext = () => {
-    current.value = Math.min(maxStep.value, current.value + 1);
-};
-
-// 点击步骤条
-const setCurrent = (e) => {
-    current.value = e;
-    emit('step-change', e); // Emit step change to parent
-};
-
-// 取消
-const onCancel = () => {
-    emit('onCancel', true)
-}
-
-// 确认
-const onFinish = () => {
-    emit('onSubmit', formState.value)
-    current.value = Math.min(maxStep.value + 1, current.value + 1);
-    submitShow.value = true
-}
-</script>
-
-<style scoped>
-.header {
-    margin-bottom: 50px;
-    display: flex;
-    justify-content: end;
-}
-
-.form-container{
-    width: 100%;
-    display: flex;
-    justify-content: center;
-}
-</style>

+ 0 - 28
src/hooks/enum.js

@@ -1,28 +0,0 @@
-// 字典类型枚举值
-export const enum_dict = {
-    TRAFFIC_PACKET_STATUS: "trafficPacketStatus", // 流量包状态
-    SUBSCRIPTION_RELATIONSHIP_STATUS: "subscriptionRelationshipStatus", // 订阅关系状态
-    MAIN_CARD_STATUS: "mainCardStatus", // 主卡状态
-    PACKAGE_TRIFF_PLAN_STATUS: "packageTariffPlanStatus", // 套餐资费计划判断状态
-    SUPPLIER_SOURCE: "supplierSource", // 来源(订单管理列表-运营商)
-    TRAFFI_CTYPE: "TrafficType", // 流量类型
-    SOURCE: "source", // 来源(资费列表)
-    CARD_TYPE: "cardType", // 卡类型
-    GROUP_POOL: "groupPool", // 组池
-    SILENCE: "silenceOf", // 沉默期
-    BILLING_CYCLE: "Billingcycle", // 账单计费周期
-    BILLING_TYPE: "BillingType", // 计费分类
-    BILLING_METHOD: "billingMethod", // 流量结算方式
-    SETTLEMENT_CYCLE: "settlementCycle", // 结算周期
-    TRAFFIC_POOL_TYPE: "trafficPoolType", // 流量池类型
-    TRAFFIC_USAGE_TYPE: "trafficUsageType", // 流量使用限制类型
-    CYCLE_TYPE: "cycleType", // 周期类型
-    ACTIVATION_PACKAGE: "activationPackageMethod", // 激活卡套餐方法
-    FLOW_PACKET_TYPE: "flowPacketType", // 流量包类型
-    DEDUCTION_MODEL: "deductionModel", // 套餐收费方式
-    FLOW_PERIOD: "flowPeriod", // 流量包套餐时长
-    ACTIVATE_METHOD: "activateMethod", // 激活方式-激活流量结算方式
-    ORDER_AUDIT_STATUS: "orderAuditStatus", // 订单审核状态
-    ORDER_TYPE: "orderType", // 订单状态
-    CURRENCY_TYPE:'currencyType', // 币种
-};

+ 0 - 78
src/mixins/index.js

@@ -1,78 +0,0 @@
-import { dictionaryDeleteAll } from "@/api/path/dict.js";
-import { ref } from "vue";
-// 获取字典
-export function Getdictionary(params) {
-    if (Array.isArray(params)) {
-        // 存储每个请求的 Promise
-        const promises = params.map(item => {
-            return dictionaryDeleteAll({ typeKey: item }).then((res) => {
-                return res.data;
-            });
-        });
-        // 使用 Promise.all 处理多个请求
-        return Promise.all(promises).then(results => {
-            return results;
-        });
-    } else {
-        // 非数组时,直接请求
-        return dictionaryDeleteAll({ typeKey: params }).then((res) => {
-            return res.data;
-        });
-    }
-}
-
-// 过滤字典值
-export function filterDict(item, value) {
-    if (!Array.isArray(item)) return false
-    return item.find(val => val.value == value)?.label
-}
-
-// 处理表格分页 && 搜索 && 搜索表单重置 && 及请求到的数据公共处理方法
-export function tableFunction(_this, apiRequest, processData) {
-    // 表格数据
-    const tableData = ref([]);
-    // 搜索数据
-    const SearchForm = ref({});
-
-    // 请求数据方法,使用外部传入的 apiRequest 方法
-    const initData = async (item) => {
-        if (item) {
-            SearchForm.value = item;
-        }
-        const param = {
-            ..._this,
-            ...SearchForm.value // 搜索使用的方法
-        };
-        delete param.pageSize
-        param.size = _this.pageSize
-        // 调用外部传入的请求方法,并传递分页参数
-        const res = await apiRequest(param);
-        if (res.code === 200) {
-            // 使用外部的方法来处理值
-            tableData.value = processData ? await processData(res.data) : res.data.records || res.data;
-            _this.total = res.data.total;
-        }
-    };
-
-    // 分页变化时的处理方法
-    const evChangePage = (e) => {
-        _this.current = e;
-        initData();  // 调用请求数据方法
-    };
-
-    // 表单重置
-    const reset = (item) => {
-        SearchForm.value = item;
-        _this.current = 1;
-        initData();
-    };
-
-    // 将事件处理方法暴露给组件
-    return {
-        evChangePage,
-        initData,
-        reset,
-        tableData,
-        SearchForm
-    };
-}

+ 0 - 13
src/router/router.system.js

@@ -5,19 +5,6 @@ const ERROR = () => import('@/views/exception/errors.vue')
 
 // login
 const LOGIN = () => import("@/views/login/index.vue")
-const HOME = () => import("@/views/home/index.vue")
-
-export const publicMenu = [
-  {
-    path: "/home",
-    name: "home",
-    component: HOME,
-    meta: {
-      title: '首页',
-      icon: 'Dh-shouye3'
-    }
-  },
-]
 
 export const systemRoutes = [
   {

+ 2 - 4
src/router/router.update.js

@@ -2,7 +2,6 @@ import { systemUserInfoMenu } from "@/api/path/system.api";
 import { systemRoutes } from "./router.system";
 import { getLocalStorage, getParseLang } from '@/utils'
 import { lang } from '@/settings/designSetting'
-import { publicMenu } from './router.system.js'
 const LAYOUT = () => import("@/components/Layout/Layout.vue");
 
 const findPath = (data) => {
@@ -57,14 +56,13 @@ export const updateRouteByMenu = async (router, systemStore) => {
       value: menuList || [],
       localStorage: true,
     });
-    const pathHome = findPath(publicMenu[0]);
     const mainRoutes = toRoutesJson(menuList);
     const routes = {
       path: "/",
       name: "main",
-      redirect: pathHome.path,
+      redirect: '/system-menu',
       component: LAYOUT,
-      children: [...publicMenu, ...mainRoutes],
+      children: [ ...mainRoutes],
     };
     router.options.routes = [routes, ...systemRoutes];
     await router.addRoute(routes);

+ 0 - 59
src/store/modules/routerTag.js

@@ -1,59 +0,0 @@
-import { defineStore } from "pinia";
-
-export const RouterTagData = defineStore({
-  id: "RouterTagData",
-  state: () => ({
-    tagData: [] || localStorage.getItem("RouterTagData"),
-    getMenuTabSate: localStorage.getItem("menuTabSate") || "",
-  }),
-  getters: {},
-  actions: {
-    tagsPushData(data) {
-      // 先将已有的相同 name 的标签移除
-      this.tagData = this.tagData.filter((res) => res.name !== data.name);
-      // 再将新的标签加入
-      this.tagData.push(data);
-      this.localStorageTagsData(this.tagData);
-      this.getDefault(data.name);
-    },
-    // 初始化标签
-    tagsPushFilter(data) {
-      if (data.length !== 0) {
-        this.tagData = JSON.parse(data);
-      } else {
-        this.tagData = data;
-      }
-    },
-    // 删除标签
-    handleRemove(data) {
-      this.tagData.forEach((item, index) => {
-        if (item.name === data) {
-          const itemIndex = index;
-          let previousItem = null;
-          // 判断是否是最后一个元素
-          if (itemIndex === this.tagData.length - 1) {
-            if (itemIndex > 0) {
-              previousItem = this.tagData[itemIndex - 1];
-            }
-          } else {
-            previousItem = this.tagData[itemIndex + 1];
-          }
-          this.tagData.splice(index, 1);
-          this.localStorageTagsData(this.tagData);
-          // 添加判断,避免previousItem为null时报错(比如删除最后一个元素且之前判断没取到前一个元素时)
-          if (previousItem) {
-            this.getDefault(previousItem.name);
-          }
-        }
-      });
-    },
-    localStorageTagsData(data) {
-      localStorage.setItem("RouterTagData", JSON.stringify(data));
-    },
-    // 默认选中菜单
-    getDefault(data) {
-      this.getMenuTabSate = data;
-      localStorage.setItem("menuTabSate", data);
-    },
-  },
-});

+ 1 - 54
src/utils/axios.js

@@ -94,7 +94,7 @@ axiosInstance.interceptors.response.use(
       const dataList = {
         code: code,
         message: res.data.msg,
-        data: DataViewsProvider(data),
+        data:data,
       };
       return Promise.resolve(dataList);
     }
@@ -149,57 +149,4 @@ axiosInstance.interceptors.response.use(
   }
 );
 
-function timeLoadTemeYear(value) {
-  if (!value) return;
-  const systemStore = useSystemStore();
-  const timezone = systemStore.getUserIp?.timezone || JSON.parse(localStorage.getItem('IPCONFIG'))?.timezone;
-  if (timezone) {
-    let localDate = moment.utc(value).tz(timezone);
-
-    if (!localDate.isValid()) {
-      return null;
-    }
-
-    const localTime = localDate.format('YYYY-MM-DD HH:mm:ss');
-    return localTime;
-  }
-
-  return value;
-}
-
-function DataViewsProvider(data) {
-  if (!data) return data;
-
-  if (data.records && Array.isArray(data.records)) {
-    return {
-      ...data,
-      records: data.records.map(item => {
-        const transformedItem = { ...item };
-
-        if (item.createdAt) transformedItem.createdAt = timeLoadTemeYear(item.createdAt);
-        if (item.updatedAt) transformedItem.updatedAt = timeLoadTemeYear(item.updatedAt);
-        if (item.endDate) transformedItem.endDate = timeLoadTemeYear(item.endDate);
-        if (item.activeTime) transformedItem.activeTime = timeLoadTemeYear(item.activeTime);
-
-        return transformedItem;
-      })
-    };
-  }
-
-  if (Array.isArray(data)) {
-    return data.map(item => {
-      const transformedItem = { ...item };
-
-      if (item.createdAt) transformedItem.createdAt = timeLoadTemeYear(item.createdAt);
-      if (item.updatedAt) transformedItem.updatedAt = timeLoadTemeYear(item.updatedAt);
-      if (item.endDate) transformedItem.endDate = timeLoadTemeYear(item.endDate);
-      if (item.activeTime) transformedItem.activeTime = timeLoadTemeYear(item.activeTime);
-
-      return transformedItem;
-    });
-  }
-
-  return data;
-}
-
 export default axiosInstance;

+ 0 - 68
src/views/admin/OperationLog/config.js

@@ -1,68 +0,0 @@
-export const columns = [
-  {
-    title: "序号",
-    dataIndex: "index",
-    align: "center",
-    ellipsis: true,
-    render: ({ rowIndex }) => rowIndex + 1,
-  },
-  {
-    title: "userId",
-    dataIndex: "userId",
-    align: "center",
-    ellipsis: true,
-  },
-  {
-    title: "客户名称",
-    dataIndex: "name",
-    align: "center",
-    ellipsis: true,
-  },
-  {
-    title: "账号名称",
-    dataIndex: "username",
-    align: "center",
-    ellipsis: true,
-  },
-  {
-    title: "请求方式",
-    dataIndex: "method",
-    align: "center",
-    ellipsis: true,
-  },
-  {
-    title: "请求域名",
-    dataIndex: "remark",
-    align: "center",
-    ellipsis: true,
-  },
-  {
-    title: "操作参数",
-    dataIndex: "param",
-    align: "center",
-    width: 300,
-  },
-  {
-    title: "操作时间",
-    dataIndex: "createdAt",
-    align: "center",
-    width: 300,
-  },
-]
-
-export const SearchFrom = [
-  {
-    type: "input",
-    label: "账号名称",
-    field: "name",
-    value: "", // 双向绑定的值
-  },
-  {
-    type: "range-picker",
-    label: "操作时间",
-    field: "createdAt",
-    value: [], // 双向绑定的值
-    width: "300",
-    Custom: 'mode="month"', // 自定义值
-  },
-]

+ 0 - 57
src/views/admin/OperationLog/index.vue

@@ -1,57 +0,0 @@
-<template>
-    <div>
-        <div class="search-section">
-            <Search :SearchForm="SearchFrom" @query="initData" @reset="reset" />
-        </div>
-        <a-table row-key="id" :data="tableData" :columns="columns" :pagination="pagination" :scroll="{ x: 'auto' }"
-            @page-change="evChangePage">
-            <template #id="{ record }">
-                <!-- 修改 -->
-                <a class="a-link" href="javascript:;" style="margin-right: 1rem"
-                    @click="dictShowModel(2, record)">编辑</a>
-                <!-- 删除 -->
-                <a-popconfirm :content="$t('form.Delete')" :ok-text="$t('form.Confirm')"
-                    :cancel-text="$t('form.Cancel')" @ok="handleDel(record.id)">
-                    <a class="a-link" href="javascript:;" style="margin-right: 1rem">{{
-                        $t('form.Delete')
-                    }}</a>
-                </a-popconfirm>
-            </template>
-        </a-table>
-    </div>
-</template>
-
-<script setup>
-import { onMounted, ref } from 'vue';
-import Search from '@/components/Search/index.vue'
-import { columns, SearchFrom } from './config'
-import { OperationLogSetNear } from '@/api/customer'
-import { tableFunction, filterDict } from '@/mixins/index.js'
-
-const pagination = ref({
-    total: 0,
-    pageSize: 10,
-    current: 1,
-})
-const processData = (data) => {
-    return (data.records || []).map((item, index) => {
-        return {
-            ...item,
-            param: JSON.stringify(JSON.parse(item.param))
-        }
-    })
-}
-
-const { tableData, evChangePage, initData, reset } = tableFunction(pagination.value, OperationLogSetNear, processData)
-
-onMounted(()=>{
-    initData()
-})
-</script>
-
-<style scoped lang="less">
-.search-section {
-    margin-top: 20px;
-    margin-bottom: 20px;
-}
-</style>

+ 0 - 425
src/views/admin/customer/NewCustomerForm.vue

@@ -1,425 +0,0 @@
-<template>
-  <a-modal :visible="visible" :title="editMode ? $t('customer.editCustomer') : $t('customer.addCustomer')"
-    :loading="loading" @ok="handleSubmit" @cancel="handleCancel" :width="800" :okText="$t('form.Confirm')"
-    :cancelText="$t('form.Cancel')">
-    <a-tabs v-model="activeKey">
-      <!-- 基本信息 Tab -->
-      <a-tab-pane key="1" :title="$t('customer.basicInfo')">
-        <a-form :model="formData" :rules="rules" ref="formRef" :label-col-props="{ span: 6 }"
-          :wrapper-col-props="{ span: 18 }">
-          <a-divider>{{ $t('customer.basicInfoSection') }}</a-divider>
-          <!-- Customer Code -->
-          <a-form-item field="zip" :label="$t('customer.customerCode')" required validate-trigger="blur">
-            <a-input v-model="formData.zip" :placeholder="$t('customer.enterCustomerCode')" :max-length="60"
-              show-word-limit />
-          </a-form-item>
-          <a-form-item field="email" :label="$t('customer.emailName')" required validate-trigger="blur">
-            <a-input v-model="formData.email" :placeholder="$t('customer.emailType')" :max-length="60"
-              show-word-limit />
-          </a-form-item>
-          <a-form-item field="phone" :label="$t('customer.phoneName')" required validate-trigger="blur">
-            <a-input v-model="formData.phone" :placeholder="$t('customer.phoneType')" show-word-limit />
-          </a-form-item>
-          <!-- Customer Name -->
-          <a-form-item field="name" :label="$t('customer.customerName')" required validate-trigger="blur">
-            <a-input v-model="formData.name" :placeholder="$t('customer.enterCustomerName')" :max-length="60"
-              show-word-limit />
-          </a-form-item>
-          <!-- Account Number -->
-          <a-form-item field="username" :label="$t('customer.accountNumber')" required validate-trigger="blur">
-            <a-input v-model="formData.username" :placeholder="$t('customer.enterAccountNumber')" :max-length="60"
-              show-word-limit />
-          </a-form-item>
-          <!-- Password -->
-          <a-form-item :label="$t('customer.password')" required validate-trigger="blur">
-            <a-input-password v-model="formData.password" :placeholder="$t('customer.enterPassword')" :max-length="60"
-              show-word-limit />
-            <a-button type="primary" @click="generatePassword">{{ $t('customer.generatePassword') }}</a-button>
-          </a-form-item>
-          <div class="note">
-            {{ $t('customer.note') }}
-          </div>
-          <a-form-item field="note" :label="$t('customer.remark')" required validate-trigger="blur">
-            <a-input v-model="formData.note" :placeholder="$t('customer.enterRemark')" :max-length="60"
-              show-word-limit />
-          </a-form-item>
-          <!-- Account Balance -->
-          <a-form-item field="amount" :label="$t('customer.accountBalance')" required validate-trigger="blur">
-            <a-input-number v-model="formData.amount" :min="0" :precision="2" :step="100"
-              :suffix="$t('customer.currency')" />
-          </a-form-item>
-          <!-- Address -->
-          <a-form-item field="addr" :label="$t('customer.address')" required validate-trigger="blur">
-            <a-input v-model="formData.addr" :placeholder="$t('customer.addressMessage')" :max-length="50"
-              show-word-limit />
-          </a-form-item>
-          <!-- Status -->
-          <a-form-item field="state" :label="$t('customer.statusName')" required validate-trigger="blur">
-            <a-radio-group v-model="formData.state">
-              <a-radio :value="item.value" v-for="item in userTypes">{{
-                item.value == 1 ? $t('customer.status.normal') : (item.value == 2 ? $t('customer.status.disabled') :
-                  (item.value == 3 ? $t('customer.status.pending') : $t('customer.status.suspended')))
-                }} </a-radio>
-            </a-radio-group>
-          </a-form-item>
-        </a-form>
-      </a-tab-pane>
-
-      <!-- SMS 信息 Tab -->
-      <a-tab-pane key="2" :title="$t('customer.smsInfoSection')">
-        <a-form :model="formData" :rules="rules" ref="formRef" :label-col-props="{ span: 6 }"
-          :wrapper-col-props="{ span: 18 }">
-          <a-divider>{{ $t('customer.smsInfoSection') }}</a-divider>
-          <a-form-item field="sms" :label="$t('customer.smsSubCode')" required validate-trigger="blur">
-            <a-input v-model="formData.sms" :placeholder="$t('customer.enterSmsSubCode')" :max-length="60"
-              show-word-limit />
-          </a-form-item>
-          <a-form-item field="smsSignature" :label="$t('customer.smsName')" required validate-trigger="blur">
-            <a-input v-model="formData.smsSignature" :placeholder="$t('customer.enterSmsName')" :max-length="60"
-              show-word-limit />
-          </a-form-item>
-          <a-form-item field="loginSms" :label="$t('customer.loginSmsTemplate')" required validate-trigger="blur">
-            <a-input v-model="formData.loginSms" :placeholder="$t('customer.enterLoginSmsTemplate')" :max-length="60"
-              show-word-limit />
-          </a-form-item>
-          <a-form-item field="warnSms" :label="$t('customer.alarmSmsTemplate')" required validate-trigger="blur">
-            <a-input v-model="formData.warnSms" :placeholder="$t('customer.enterAlarmSmsTemplate')" :max-length="60"
-              show-word-limit />
-          </a-form-item>
-        </a-form>
-      </a-tab-pane>
-
-      <!-- Billing Information Tab -->
-      <a-tab-pane key="3" :title="$t('customer.billingInfo')">
-        <a-form :model="formData" :rules="rules" ref="formRef" :label-col-props="{ span: 6 }"
-          :wrapper-col-props="{ span: 18 }">
-          <a-divider>{{ $t('customer.InvoiceInformation') }}</a-divider>
-          <a-form-item field="invoiceTitle" :label="$t('customer.invoiceTitle')" required validate-trigger="blur">
-            <a-input v-model="formData.invoiceTitle" :placeholder="$t('customer.enterInvoiceTitle')" :max-length="60"
-              show-word-limit />
-          </a-form-item>
-          <a-form-item field="invoiceType" :label="$t('customer.invoice_vatTextType')" required validate-trigger="blur">
-            <a-select v-model="formData.invoiceType" :style="{ width: '100%' }"
-              :placeholder="$t('customer.invoice_vatTextTypeSelect')">
-              <a-option v-for="item of invoiceList" :value="item.value" :label="item.label" />
-            </a-select>
-          </a-form-item>
-          <a-form-item field="invoiceAddr" :label="$t('customer.registeredAddress')" required validate-trigger="blur">
-            <a-input v-model="formData.invoiceAddr" :placeholder="$t('customer.enterRegisteredAddress')"
-              :max-length="60" show-word-limit />
-          </a-form-item>
-          <a-form-item field="invoiceZip" :label="$t('customer.invoiceCode')" required validate-trigger="blur">
-            <a-input v-model="formData.invoiceZip" :placeholder="$t('customer.InvoiceCodeName')" :max-length="60"
-              show-word-limit />
-          </a-form-item>
-          <a-form-item field="invoiceEmail" :label="$t('customer.invoiceEmailName')" required validate-trigger="blur">
-            <a-input v-model="formData.invoiceEmail" :placeholder="$t('customer.invoiceEmailNameType')" :max-length="60"
-              show-word-limit />
-          </a-form-item>
-          <a-form-item field="bankName" :label="$t('customer.bankName')" required validate-trigger="blur">
-            <a-input v-model="formData.bankName" :placeholder="$t('customer.enterBankName')" :max-length="60"
-              show-word-limit />
-          </a-form-item>
-          <a-form-item field="bankAccount" :label="$t('customer.BankNumber')" required validate-trigger="blur">
-            <a-input v-model="formData.bankAccount" :placeholder="$t('customer.BankNumberName')" :max-length="60"
-              show-word-limit />
-          </a-form-item>
-          <a-form-item field="bankBranch" :label="$t('customer.bank_branchName')" required validate-trigger="blur">
-            <a-input v-model="formData.bankBranch" :placeholder="$t('customer.bank_branchNameType')" show-word-limit />
-          </a-form-item>
-          <a-form-item field="businessLicense" :label="$t('customer.BusinessLicense')" required validate-trigger="blur">
-            <upload v-model="formData.businessLicense" />
-          </a-form-item>
-        </a-form>
-      </a-tab-pane>
-
-      <!-- Tax Registration Tab -->
-      <a-tab-pane key="4" :title="$t('customer.TaxRegistration')">
-        <a-form :model="formData" :rules="rules" ref="formRef" :label-col-props="{ span: 8 }"
-          :wrapper-col-props="{ span: 16 }">
-          <a-divider>{{ $t('customer.TaxRegistrationText') }}</a-divider>
-          <a-form-item field="taxRegistrationCertificate" :label="$t('customer.photocopy')" required
-            validate-trigger="blur">
-            <upload v-model:modelValue="formData.taxRegistrationCertificate" />
-          </a-form-item>
-          <a-form-item field="taxpayerQualification" :label="$t('customer.CertificationQualification')" required
-            validate-trigger="blur">
-            <upload v-model:modelValue="formData.taxpayerQualification" />
-          </a-form-item>
-        </a-form>
-      </a-tab-pane>
-
-      <a-tab-pane key="5" :title="$t('forewarning.forewarning')">
-        <a-form :model="formData" :rules="rules" ref="formRef" :label-col-props="{ span: 4 }"
-          :wrapper-col-props="{ span: 20 }">
-          <a-divider>{{ $t('forewarning.EarlyWarningSetting') }}</a-divider>
-          <a-form-item field="amountWarn" :label="$t('forewarning.AccountBalanceAlarm')" required
-            validate-trigger="blur">
-            <a-input v-model="formData.amountWarn" :placeholder="$t('form.datapoolForm.pleaseEnter')" :max-length="60"
-              :style="{ width: '320px' }" show-word-limit />
-          </a-form-item>
-          <a-form-item field="arriveWarn" :label="$t('forewarning.ReachWarning')" required validate-trigger="blur">
-            <a-input-number v-model="formData.arriveWarn" :style="{ width: '320px' }"
-              :placeholder="$t('form.datapoolForm.pleaseEnter')" allow-clear hide-button>
-              <template #suffix>
-                %
-              </template>
-            </a-input-number>
-          </a-form-item>
-          <a-form-item field="arriveNetwork" :label="$t('forewarning.NetworkOutage')" required validate-trigger="blur">
-            <a-input-number v-model="formData.arriveNetwork" :style="{ width: '320px' }"
-              :placeholder="$t('form.datapoolForm.pleaseEnter')" allow-clear hide-button>
-              <template #suffix>
-                %
-              </template>
-            </a-input-number>
-            <a-radio-group v-model="formData.arriveStopNetwork" :options="reachList"></a-radio-group>
-          </a-form-item>
-          <a-form-item field="warnPhone" :label="$t('forewarning.EarlyWarningPhone')" required validate-trigger="blur">
-            <a-input v-model="formData.warnPhone" :style="{ width: '320px' }"
-              :placeholder="$t('form.datapoolForm.pleaseEnter')" allow-clear hide-button>
-            </a-input>
-          </a-form-item>
-          <a-form-item field="warnEmail" :label="$t('forewarning.WarningMailbox')" required validate-trigger="blur">
-            <a-input v-model="formData.warnEmail" :style="{ width: '320px' }"
-              :placeholder="$t('form.datapoolForm.pleaseEnter')" allow-clear>
-            </a-input>
-          </a-form-item>
-        </a-form>
-      </a-tab-pane>
-    </a-tabs>
-  </a-modal>
-</template>
-
-
-<script setup>
-import { ref, watch, onMounted } from 'vue';
-import { Message } from '@arco-design/web-vue';
-import { useI18n } from 'vue-i18n';
-import { dictionaryDetail } from '@/api/path/dict.js'
-import Upload from "@/components/upload/index.vue";
-import { systemFindRoleList } from "@/api/path/system.api.js";
-import { addCustomer, updateCustomer } from "@/api/customer.js";
-import { Getdictionary } from '@/mixins/index.js'
-const { t } = useI18n();
-import { encryptByDES } from '@/utils/crypto.js'
-
-const props = defineProps({
-  visible: Boolean,
-  editMode: Boolean,
-  editData: Object,
-  loading: Boolean,
-});
-
-const invoiceList = ref([])
-const roles = ref([])
-const userTypes = ref([])
-const activeKey = ref(1)
-watch(
-  () => props.editData,
-  (newVal) => {
-    if (newVal && props.editMode) {
-      // 深拷贝编辑数据
-      const editDataCopy = JSON.parse(JSON.stringify(newVal));
-      delete editDataCopy.alert.id
-      delete editDataCopy.alert.userId
-      delete editDataCopy.alert.createdAt
-      delete editDataCopy.alert.deletedAt
-      delete editDataCopy.alert.updatedAt
-      // 检查并展平嵌套的 info 对象
-      let flattenedFormData = {};
-      let flasAlert = {}
-      if (editDataCopy.info) {
-        flattenedFormData = { ...editDataCopy.info }; // 展平 info 的键值对
-        flasAlert = { ...editDataCopy.alert }
-        delete editDataCopy.info; // 删除原始 info 字段
-        delete editDataCopy.alert; // 删除原始 info 字段
-      }
-
-      // 合并 editDataCopy 和 flattenedFormData
-      const formDataList = {
-        ...editDataCopy,
-        ...flattenedFormData, // 此处直接使用展开后的 flattenedFormData
-        ...flasAlert
-      };
-
-      // 更新 formData 的值
-      formData.value = formDataList;
-
-    }
-
-  }
-);
-
-const emit = defineEmits(['update:visible', 'submit']);
-
-const formRef = ref(null);
-const reachList = ref([])
-const formData = ref({
-  username: "",
-  state: "",
-  name: "",
-  password: "",
-  phone: "",
-  email: "",
-  addr: "",
-  zip: "",
-  note: "",
-  sms: "",
-  smsSignature: "",
-  loginSms: "",
-  warnSms: "",
-  amount: "",
-  invoiceTitle: "",
-  invoiceType: "",
-  invoiceAddr: "",
-  invoiceZip: "",
-  invoiceEmail: "",
-  bankName: "",
-  bankAccount: "",
-  bankBranch: "",
-  businessLicense: "",
-  taxRegistrationCertificate: "",
-  taxpayerQualification: "",
-  amountWarn: '',
-  arriveWarn: '',
-  // arriveStop: '',
-  arriveNetwork: '',
-  arriveStopOperation: '',
-  arriveStopNetwork: '',
-  warnPhone: '',
-  warnEmail: ''
-});
-
-const rules = {
-  userName: [{ required: true, message: t('customer.enterAccountNumber') }],
-  state: [{ required: true, message: t('customer.stateType') }],
-  name: [{ required: true, message: t('customer.nameType') }],
-  // password: [{ required: true, message: t('customer.passwordRequired') }],
-  // roleIds: [{required: true, message: t('customer.roleIdsType')}],
-  // userType: [{required: true, message: t('customer.userTypeType')}],
-  phone: [{ required: true, message: t('customer.phoneType') }],
-  email: [{ required: true, message: t('customer.emailType') }],
-  addr: [{ required: true, message: t('customer.addressRequired') }],
-  amount: [{ required: true, message: t('customer.amountRequired') }],
-  bankAccount: [{ required: true, message: t('customer.bankAccountRequired') }],
-  bankBranch: [{ required: true, message: t('customer.bankBranchRequired') }],
-  bankName: [{ required: true, message: t('customer.bankNameRequired') }],
-  businessLicense: [{ required: true, message: t('customer.businessLicenseRequired') }],
-  invoiceAddr: [{ required: true, message: t('customer.invoiceAddressRequired') }],
-  invoiceEmail: [{ required: true, message: t('customer.invoiceEmailRequired') }],
-  invoiceTitle: [{ required: true, message: t('customer.invoiceTitleRequired') }],
-  invoiceType: [{ required: true, message: t('customer.invoiceTypeRequired') }],
-  invoiceZip: [{ required: true, message: t('customer.invoiceZipRequired') }],
-  loginSms: [{ required: true, message: t('customer.loginSMSTemplateRequired') }],
-  note: [{ required: true, message: t('customer.noteRequired') }],
-  sms: [{ required: true, message: t('customer.smsRequired') }],
-  smsSignature: [{ required: true, message: t('customer.smsSignatureRequired') }],
-  warnSms: [{ required: true, message: t('customer.warnSMSTemplateRequired') }],
-  zip: [{ required: true, message: t('customer.zipCodeRequired') }],
-  taxRegistrationCertificate: [{ required: true, message: t('customer.taxRegistrationCertificateRequired') }],
-  taxpayerQualification: [{ required: true, message: t('customer.taxpayerQualificationRequired') }],
-};
-
-
-const handleSubmit = () => {
-    formRef.value.validate(async (values, errors) => {
-      if (!errors) {
-        if (formData.value.password) {
-          formData.value.password = encryptByDES(formData.value.password);
-        }else{
-          formData.value.password = ''; // 若不修改密码,则置空
-        }
-        formData.value.amountWarn = Number(formData.value.amountWarn);
-        formData.value.warnPhone = String(formData.value.warnPhone);
-        formData.value.warnEmail = String(formData.value.warnEmail);
-        let response;
-        if (props.editMode) {
-          response = await updateCustomer(formData.value);
-        } else {
-          response = await addCustomer(formData.value);
-        }
-        if (response.code === 200) {
-          Message.success(props.editMode ? t('customer.updateSuccess') : t('customer.addSuccess'));
-          emit('submit', true);
-          emit('update:visible', false);
-        } else {
-          Message.error(response.message || (props.editMode ? t('customer.updateFailed') : t('customer.addFailed')));
-        }
-
-      }
-    });
-};
-
-const handleCancel = () => {
-  Object.keys(formData.value).forEach(key => {
-    formData.value[key] = ''
-  })
-  formRef.value = null
-  emit('update:visible', false);
-};
-
-
-const generatePassword = () => {
-  formData.value.password = Math.random().toString(36).slice(-8);
-  Message.success(t('customer.passwordGenerated'));
-};
-
-
-const getDistList = async () => {
-  let code = ['invoiceVat', 'reach'];
-
-  for (let i = 0; i < code.length; i++) {
-    let res = await dictionaryDetail({ typeKey: code[i] });
-    if (res.code === 200) {
-      if (i == 0) {
-        invoiceList.value = res.data;
-      } else {
-        reachList.value = res.data;
-      }
-
-    }
-  }
-}
-
-const getRolesData = async () => {
-  let res = await systemFindRoleList()
-  if (res.code === 200) {
-    roles.value = res.data
-  }
-}
-
-const getList = async () => {
-  let res = await Getdictionary('userType')
-  userTypes.value = res
-}
-
-watch(() => props.visible, val => {
-  if (!val) {
-    Object.keys(formData.value).forEach(key => {
-      formData.value[key] = ''
-    })
-  } else {
-    getRolesData()
-    getDistList()
-    getList()
-  }
-}, { immediate: true })
-
-</script>
-
-<style scoped>
-.upload-description {
-  font-size: 12px;
-  color: #999;
-  margin-top: 4px;
-}
-
-.note {
-  color: #f73f3f;
-  text-align: center;
-  position: relative;
-  top: -20px;
-  left: 65px;
-}
-</style>

+ 0 - 93
src/views/admin/customer/config.js

@@ -1,93 +0,0 @@
-
-
-// 客户搜索字段
-export const UserSearchForm = [
-    {
-      type: "input",
-      label: "客户名称",
-      field: "name",
-      value: "", // 双向绑定的值
-    },
-    {
-      type: "input",
-      label: "客户账号",
-      field: "username",
-      value: "", // 双向绑定的值
-    },
-    {
-      type: "select",
-      label: "客户状态",
-      field: "state",
-      options: [], // 默认空,后面会通过字典加载
-      dict: "userType",
-      value: "", // 双向绑定的值
-      width: "200",
-    },
-    {
-      type: "range-picker",
-      label: "创建时间",
-      field: "createdAt",
-      value: [], // 双向绑定的值
-      width: "300",
-      Custom: 'mode="month"', // 自定义值
-    },
-  ];
-  
-  export const UserColumns = [
-    {
-      title: window.$t("customer.id"),
-      dataIndex: "id",
-      align: "center",
-      ellipsis: true,
-    },
-    {
-      title: window.$t("customer.customerName"),
-      dataIndex: "name",
-      align: "center",
-      ellipsis: true,
-    },
-    {
-      title: window.$t("customer.userAdmin"),
-      dataIndex: "username",
-      align: "center",
-      minWidth: "200",
-    },
-    {
-      title: window.$t("customer.cardNum"),
-      dataIndex: "simCount",
-      align: "center",
-      minWidth: "200",
-    },
-    {
-      title: window.$t("customer.customerStatus"),
-      slotName: "state",
-      align: "center",
-      ellipsis: true,
-    },
-    { title: "app_key  ", dataIndex: "appKey", align: "center", ellipsis: true },
-    {
-      title: "app_secret",
-      dataIndex: "appSecret",
-      align: "center",
-      ellipsis: true,
-    },
-    {
-      title: window.$t("customer.startTime"),
-      dataIndex: "createdAt",
-      align: "center",
-      ellipsis: true,
-    },
-    {
-      title: window.$t("customer.updateTime"),
-      dataIndex: "updatedAt",
-      align: "center",
-      ellipsis: true,
-    },
-    {
-      title: window.$t("global.common.operations"),
-      slotName: "operation",
-      align: "center",
-      ellipsis: true,
-      fixed: "right",
-    },
-  ];

+ 0 - 145
src/views/admin/customer/index.vue

@@ -1,145 +0,0 @@
-<!-- 客户管理-用户管理 -->
-<template>
-  <div class="customer-management">
-    <!-- 搜索条件区 -->
-    <div class="search-section">
-      <Search :SearchForm="UserSearchForm" @query="initData" @reset="reset" />
-    </div>
-
-    <!-- 顶部操作区 -->
-    <div class="top-actions">
-      <a-space>
-        <a-button type="primary" @click="showNewCustomerForm">{{ $t('customer.addCustomer') }}</a-button>
-      </a-space>
-    </div>
-
-    <!-- 数据表格 -->
-    <a-table row-key="id" :columns="UserColumns" :data="tableData" :pagination="pagination" :scroll="{ x: 'auto' }"
-      :row-selection="{ type: 'checkbox', showCheckedAll: true }" @page-change="evChangePage">
-      <template #state="{ record }">
-        <a-tag :color="getStatusColor(record.state)">
-          {{ $t(`customer.status.${getStatusText(record.state)}`) }}
-        </a-tag>
-      </template>
-      <template #operation="{ record }">
-        <a-space>
-          <a-button type="text" size="small" @click="handleEdit(record)">{{
-            $t('global.common.edit')
-          }}
-          </a-button>
-        </a-space>
-      </template>
-    </a-table>
-
-    <!-- 新客户表单对话框 -->
-    <new-customer-form v-model:visible="newCustomerFormVisible" :editMode="editMode" :editData="editData"
-      :loading="loading" @submit="handleNewCustomerSubmit" />
-  </div>
-</template>
-
-<script setup>
-import { ref, reactive, computed, onMounted } from 'vue';
-import { Message } from '@arco-design/web-vue';
-import { useI18n } from 'vue-i18n';
-import NewCustomerForm from './NewCustomerForm.vue';
-import { getMessUserList, deleteMessUser } from '@/api/customer.js';
-import { UserSearchForm, UserColumns } from './config'
-import Search from '@/components/Search/index.vue'
-import { tableFunction } from '@/mixins/index'
-const { t } = useI18n();
-
-const loading = ref(false);
-
-const pagination = ref({
-  total: 100,
-  current: 1,
-  pageSize: 10,
-});
-
-const { tableData, evChangePage, initData, reset } = tableFunction(pagination.value, getMessUserList)
-
-
-const newCustomerFormVisible = ref(false);
-const editMode = ref(false);
-const editData = ref(null);
-
-
-const showNewCustomerForm = () => {
-  editMode.value = false;
-  editData.value = null;
-  newCustomerFormVisible.value = true;
-};
-
-const handleEdit = async (record) => {
-  try {
-    loading.value = true;
-    const response = await deleteMessUser({ id: record.id });
-    if (response.code === 200) {
-      // 处理返回的数据,确保数据结构匹配表单
-      editMode.value = true;
-      editData.value = response.data;
-      newCustomerFormVisible.value = true;
-    } else {
-      Message.error(response.message || t('customer.fetchFailed'));
-    }
-  } catch (error) {
-    console.error('获取客户详情时发生错误:', error);
-    Message.error(t('customer.fetchError'));
-  } finally {
-    loading.value = false;
-  }
-};
-
-
-const handleNewCustomerSubmit = (formData) => {
-  if (formData) {
-    newCustomerFormVisible.value = false;
-    initData();
-  }
-};
-
-
-const getStatusColor = (state) => {
-  const stateColors = {
-    '1': 'green',    // 正常 - 绿色
-    '2': 'red',      // 禁用 - 红色
-    '3': 'orange',   // 待审 - 橙色
-    '4': 'gray'      // 暂停 - 灰色
-  };
-  return stateColors[state] || 'default';
-};
-
-const getStatusText = (state) => {
-  const stateTexts = {
-    '1': 'normal',     // 正常
-    '2': 'disabled',   // 禁用
-    '3': 'pending',    // 待审
-    '4': 'suspended'   // 暂停
-  };
-  return stateTexts[state] || 'undefined';
-};
-
-
-onMounted(() => {
-  initData();
-});
-
-</script>
-
-<style scoped>
-.customer-management {
-  padding: 20px !important;
-}
-
-.top-actions {
-  margin-bottom: 20px;
-}
-
-.search-section {
-  margin-bottom: 20px;
-}
-
-.customer-management .arco-table-th {
-  white-space: nowrap;
-}
-</style>

+ 0 - 132
src/views/admin/flowPool/FlowpoolRecord/index.vue

@@ -1,132 +0,0 @@
-<!-- 流量池 -->
-<template>
-  <div class="container">
-    <!-- 搜索条件区 -->
-    <div class="search-section">
-      <Search :SearchForm="SearchFormListOperationLog" @query="initData" @reset="reset"></Search>
-    </div>
-
-    <a-table row-key="id" :data="tableData" :columns="columnsFlowOperationLog" :pagination="pagination" :scroll="{ x: 'auto' }"
-      @page-change="evChangePage">
-
-      <template #status="{ record }">
-        <a-tag :color="record.status == 1 ? '#00b42a' : '#f53f3f'">{{ trafficList.find(val => val.value ==
-          record.status)?.label }}</a-tag>
-      </template>
-
-    </a-table>
-
-
-  </div>
-</template>
-
-<script setup>
-import { onMounted, ref, toRefs } from "vue";
-import { columnsFlowOperationLog, SearchFormListOperationLog } from "../config";
-import {
-  updateFlowPoolData,
-} from "@/api/path/flowPool.api"
-import { useSystemStore } from "@/store/modules/systemStore"
-import { Getdictionary, tableFunction, filterDict } from '@/mixins/index.js'
-import Search from '@/components/Search/index.vue'
-const systemStore = useSystemStore()
-const state = ref({
-  pagination: {
-    total: 0,
-    pageSize: 10,
-    current: 1,
-  },
-  sourceList: [],
-  trafficList: [],
-})
-const {
-  pagination,
-  sourceList,
-  trafficList,
-} = toRefs(state.value)
-
-const processData = (data) => {
-  return (data.records || []).map((item, index) => {
-    item.children = item.children?.map(res => {
-      return {
-        ...res,
-        sourceName: filterDict(sourceList.value, item.source),// 运营商名称
-        Activated: item.cardAct + '/' + item.iccidCount,
-        HaveBeenUsed: item.size + item.sizeType,
-        trafficPoolType: res.trafficPoolType == 1 ? '前流量池' : '后流量池',
-        simTariffName: item.simTariffName,
-        size: res.size + '/' + res.sizeType
-      }
-    })
-    return {
-      ...item,
-      sourceName: filterDict(sourceList.value, item.source),// 运营商名称
-      Activated: item.cardAct + '/' + item.iccidCount,
-      trafficPoolType: item.trafficPoolType == 1 ? '前流量池' : '后流量池',
-      HaveBeenUsed: item.size + item.sizeType,
-      size: item.size + '/' + item.sizeType
-    }
-  })
-}
-
-const { tableData, evChangePage, initData, reset } = tableFunction(pagination.value, updateFlowPoolData, processData)
-
-
-const handleDictValue = async () => {
-  let dict = await Getdictionary(['source', 'trafficPacketStatus'])
-  sourceList.value = dict[0]
-  trafficList.value = dict[1]
-}
-
-onMounted(async () => {
-  await handleDictValue()
-  await initData()
-})
-
-</script>
-
-<style scoped lang="less">
-.m-r-10 {
-  margin-right: 10px;
-}
-
-.search-section {
-  margin-top: 20px;
-  margin-bottom: 20px;
-}
-
-.container {
-  .head-title {
-    display: flex;
-    justify-content: space-between;
-  }
-
-  .form-row {
-    display: flex;
-
-    .form-row-col {
-      width: 25%;
-      display: flex;
-      align-items: center;
-
-      .form-row-label {
-        width: 120px;
-        text-align: right;
-      }
-    }
-  }
-}
-
-silent-expire-alarm {
-  padding: 20px !important;
-  // background: #fcf;
-}
-
-.search-section {
-  margin-bottom: 20px;
-}
-
-.audit-btn {
-  margin-bottom: 10px;
-}
-</style>

+ 0 - 212
src/views/admin/flowPool/Forwardflowpool/index.vue

@@ -1,212 +0,0 @@
-<!-- 流量池 -->
-<template>
-  <div class="container">
-    <!-- 搜索条件区 -->
-    <div class="search-section">
-      <Search :SearchForm="SearchFormList" @query="initData" @reset="reset"></Search>
-    </div>
-
-    <div class="audit-btn">
-      <a-button @click="dictShowModel(1, null)" type="text" >
-        <template #icon>
-          <icon-plus-circle />
-        </template>
-        <template #default>
-          {{ $t('form.Add') }}
-        </template>
-      </a-button>
-    </div>
-
-    <a-table row-key="id" :data="tableData" :columns="columns" :pagination="pagination" :scroll="{ x: 'auto' }"
-      @page-change="evChangePage">
-      <template #id="{ record }">
-        <!-- 修改 -->
-        <a class="a-link" href="javascript:;" style="margin-right: 1rem" @click="dictShowModel(2, record)"
-          >{{
-            $t('form.Edit')
-          }}</a>
-        <a class="a-link" href="javascript:;" style="margin-right: 1rem" @click="handelForewring(record)"
-          >{{ $t('flowPool.Waring') }}</a>
-        <!-- <a class="a-link" href="javascript:;" style="margin-right: 1rem" @click="handelgetCard(record)">导卡</a> -->
-        <!-- 删除 -->
-        <a-popconfirm :content="$t('form.Delete')" :ok-text="$t('form.Confirm')" :cancel-text="$t('form.Cancel')"
-          @ok="handleDel(record.id)">
-          <a class="a-link" href="javascript:;" style="margin-right: 1rem" >{{
-            $t('form.Delete')
-          }}</a>
-        </a-popconfirm>
-      </template>
-
-      <template #status="{ record }">
-        <a-tag :color="record.status == 1 ? '#00b42a' : '#f53f3f'">{{ trafficList.find(val => val.value ==
-          record.status)?.label }}</a-tag>
-      </template>
-
-
-    </a-table>
-
-    <add v-model:model-value="showAdd" status="1" :typeCurrent="typeCurrent" :record="record" @submit="initData()">
-    </add>
-    <Forewarning v-model:modelValue="visibleForewarning" ref="forewarning" @submit="initData()" />
-    <GuideCard v-model:model-value="ShowOpenExport" />
-
-  </div>
-</template>
-
-<script setup>
-import { onMounted, ref, getCurrentInstance, toRefs } from "vue";
-import { columns, SearchFormList } from "../config";
-import { Message } from '@arco-design/web-vue'
-import {
-  deleteTrafficPool,
-  lotCatdList,
-} from "@/api/path/flowPool.api"
-import { useSystemStore } from "@/store/modules/systemStore"
-import { Getdictionary, tableFunction, filterDict } from '@/mixins/index.js'
-import Forewarning from "../components/forewarning.vue";
-import add from '../components/add.vue'
-import GuideCard from "../components/GuideCard.vue"
-import { useI18n } from 'vue-i18n'
-const { t } = useI18n();
-const systemStore = useSystemStore()
-import Search from '@/components/Search/index.vue'
-const state = ref({
-  role: systemStore.getRole,
-  formRef: null,
-  searchForm: {},
-  pagination: {
-    total: 0,
-    pageSize: 10,
-    current: 1,
-    trafficPoolType: "1",
-  },
-  sourceList: [],
-  trafficList: [],
-  typeList: [],
-  tariffIdList: [],
-  ShowOpenExport: false,
-  visibleForewarning: false,
-  showAdd: false,
-  typeCurrent: 1,
-  record: {},
-  forewarning: null
-})
-const {
-  role,
-  pagination,
-  typeCurrent,
-  sourceList,
-  trafficList,
-  ShowOpenExport,
-  visibleForewarning,
-  showAdd,
-  record,
-  forewarning
-} = toRefs(state.value)
-
-const processData = (data) => {
-  return (data.records || []).map((item, index) => {
-    // 换算Gb
-    const afterFirstConversion = item.dataUsage / 1024
-    const afterSecondConversion = afterFirstConversion / 1024;
-    const result = Math.ceil(afterSecondConversion * 100) / 100;
-    const dataUsage = result.toFixed(2);
-    return {
-      ...item,
-      sourceName: filterDict(sourceList.value, item.source),// 运营商名称
-      Activated: item.cardAct + '/' + item.iccidCount,
-      HaveBeenUsed: item.size + item.sizeType,
-      dataUsage
-    }
-  })
-}
-
-const { tableData, evChangePage, initData, reset } = tableFunction(pagination.value, lotCatdList, processData)
-
-// 删除
-const handleDel = async (id) => {
-  const { code } = await deleteTrafficPool({ id })
-  if (code == 200) {
-    Message.success({
-      content: t('setting.deleteSuccess'),
-      duration: 2000,
-    })
-    initData()
-  }
-};
-
-// 弹框
-const dictShowModel = (type, data) => {
-  typeCurrent.value = type
-  record.value = data
-  showAdd.value = true
-}
-
-const handelForewring = (item) => {
-  forewarning.value.detaile(item)
-  visibleForewarning.value = true
-}
-
-const handleDictValue = async () => {
-  let dict = await Getdictionary(['source', 'trafficPacketStatus'])
-  sourceList.value = dict[0]
-  trafficList.value = dict[1]
-}
-
-const handelgetCard = (item) => {
-  ShowOpenExport.value = true
-}
-
-onMounted(async () => {
-  await handleDictValue()
-
-  await initData()
-})
-
-</script>
-
-<style scoped lang="less">
-.m-r-10 {
-  margin-right: 10px;
-}
-
-.search-section {
-  margin-top: 20px;
-  margin-bottom: 20px;
-}
-
-.container {
-  .head-title {
-    display: flex;
-    justify-content: space-between;
-  }
-
-  .form-row {
-    display: flex;
-
-    .form-row-col {
-      width: 25%;
-      display: flex;
-      align-items: center;
-
-      .form-row-label {
-        width: 120px;
-        text-align: right;
-      }
-    }
-  }
-}
-
-silent-expire-alarm {
-  padding: 20px !important;
-  // background: #fcf;
-}
-
-.search-section {
-  margin-bottom: 20px;
-}
-
-.audit-btn {
-  margin-bottom: 10px;
-}
-</style>

+ 0 - 190
src/views/admin/flowPool/components/GuideCard.vue

@@ -1,190 +0,0 @@
-<template>
-    <a-modal v-model:visible="modelValue" @ok="handleOk" @cancel="handleCancel" width="1200px" title="导卡">
-        <div class="card_item_header">
-            <a-button type="primary" @click="showCard=true" :disabled="show">分配卡号</a-button>
-            <a-button type="primary" @click="DownloadSampleFile">下载示例文件</a-button>
-        </div>
-        
-        <div class="search">
-           <Search :SearchForm="CardSearchForm"></Search>
-        </div>
-
-        <div class="detail-table" v-if="!show">
-            <a-table :columns="columnsExport" :data="dataExport" />
-        </div>
-
-        <div class="progress" v-if="show">
-            <div class="cusrte">
-                <a-progress type="circle" :percent="(schedule / 100)" size="large" />
-            </div>
-        </div>
-    </a-modal>
-
-    <a-modal v-model:visible="showCard" :title="$t('order.AllocationCardNumber')"
-        @cancel="closeModal(showCard, FormDataList)" @before-ok="showCard = false" :okText="$t('form.Confirm')"
-        :cancelText="$t('form.Cancel')">
-        <div style="display: flex;justify-content: space-between;">
-            <div>
-                <Upload listType="" minx="1" accept=".xlsx" :handelUpload="customRequest" :showRemoveButton="false">
-                </Upload>
-                <span style="color: #ccc;margin-top: 10px;display: inline-block;">请上传.xlsx文件</span>
-            </div>
-            <div>
-                <a-button type="primary" @click="DownloadSampleFile">下载示例文件</a-button>
-            </div>
-        </div>
-    </a-modal>
-</template>
-
-<script setup>
-import { ref, onMounted, toRefs, toRef, watch } from 'vue';
-import { downloadFile } from '@/utils/xlsx.js'
-import {DistributionCard} from '@/api/path/order'
-import Search from '@/components/Search/index.vue'
-
-const props = defineProps({
-    modelValue: {
-        type: Boolean,
-        default: false
-    },
-})
-
-const modelValue = toRef(props, 'modelValue')
-const emit = defineEmits(['update:modelValue', 'submit'])
-// 定时器ID
-let timer;
-const columnsExport = [
-    { title: 'ICCID', dataIndex: 'iccid', align: 'center' },
-    {
-        title: '卡状态',
-        dataIndex: 'name',
-    },
-    {
-        title: '创建时间',
-        dataIndex: 'exportTime',
-    },
-];
-
-const CardSearchForm = [
-{
-    type: "input",
-    label: "ICCID",
-    field: "iccid",
-    value: "", // 双向绑定的值
-  },
-  {
-    type: "select",
-    label: "卡状态",
-    field: "status",
-    options: [], 
-    dict: "trafficPacketStatus",
-    value: "", // 双向绑定的值
-    width: "200",
-  },
-  {
-    type: "date-picker",
-    label: "下单时间",
-    field: "createdAt",
-    value: "", // 双向绑定的值
-    width: "200",
-  },
-]
-
-const state = ref({
-    dataExport: [],
-    paginationCard: {
-        total: 0,
-        pageSize: 10,
-        current: 1,
-    },
-    searchForm: {
-        "label": "",
-        "trafficPoolType": "1"
-    },
-    showCard:false,
-    show: false,
-    schedule: 0,// 进度
-})
-
-const { dataExport, paginationCard, searchForm ,show,schedule} = toRefs(state.value)
-
-
-// 卡信息
-const evChangePageCard = (page) => {
-    paginationCard.value.current = page
-    intData()
-}
-
-// 导卡进度
-const CardProgress = async () => {
-    let res = await GuideCardProgress({ id: FormDataList.value.id })
-    if (res.code === 200) {
-        show.value = res.data !== 0 && res.data !== 100;
-        schedule.value = res.data;
-    }
-}
-
-// 导卡
-// 分配卡号
-const customRequest = (options) => {
-    const formData = new FormData();
-    formData.append('file', options.fileItem.file);  // 这里将文件添加到 FormDataList 中
-    formData.append('orderId', FormDataList.value.id);
-    DistributionCard(formData).then(res => {
-        if (res.code == 200) {
-            Message.success(res.message)
-            showCard.value = false
-            CardProgress()
-        }
-    })
-}
-
-const handleCancel = () => {
-    emit('update:modelValue', false)
-}
-
-// 下载示例文件
-const DownloadSampleFile = () => {
-    // 下载示例文件
-    downloadFile(['ICCID'], [['8968099000011939']])
-}
-
-
-// 监听导卡进度
-// watch(() => modelValue.value, val => {
-//     if (val) {
-//         CardProgress()
-//     } else {
-//         clearInterval(timer);
-//     }
-// }, { immediate: true })
-
-// watch(() => schedule.value, val => {
-//     // 清除旧的定时器(如果存在)
-//     if (timer) {
-//         clearInterval(timer);
-//     }
-//     timer = setInterval(() => {
-//         CardProgress();
-//         if (val === 100) {
-//             clearInterval(timer);
-//         }
-//     }, 10000);
-// })
-</script>
-<style scoped lang="less">
-.card_item_header{
-    display: flex;
-    justify-content: space-between;
-}
-
-.detail-table,.search{
-    margin-top: 1.5rem;
-}
-
-.progress {
-    margin: 1.5rem auto;
-    display: flex;
-    justify-content: center;
-}
-</style>

+ 0 - 236
src/views/admin/flowPool/components/add.vue

@@ -1,236 +0,0 @@
-<script setup>
-import { ref, onMounted, toRefs, toRef, watch } from 'vue';
-import { Message } from "@arco-design/web-vue";
-import {
-  addTrafficPool,
-  updateTrafficPool,
-  updateCardList
-} from "@/api/path/flowPool.api"
-import { tariffList } from "@/api/path/tariffManagement.api"
-import { Getdictionary } from '@/mixins/index.js'
-import { useI18n } from 'vue-i18n'
-
-const { t } = useI18n()
-const props = defineProps({
-  modelValue: {
-    type: Boolean,
-    default: false
-  },
-  status: {
-    type: [String, Number],
-    default: ''
-  },
-  typeCurrent: {
-    type: [String, Number],
-    default: ''
-  },
-  record: {
-    type: [Array, Object],
-    default: () => {
-    }
-  }
-})
-
-const modelValue = toRef(props, 'modelValue')
-const status = toRef(props, 'status')
-const typeCurrent = toRef(props, 'typeCurrent')
-const record = toRef(props, 'record')
-const emit = defineEmits(['update:modelValue', 'submit'])
-const rules = {
-  label: [{ required: true, trigger: 'change', }],
-  source: [{ required: true, trigger: 'change', }],
-  status: [{ required: true, trigger: 'change', }],
-  simTariffId: [{ required: true, trigger: 'change', }],
-  expireTime: [{ required: true, trigger: 'change', }],
-  size: [{ required: true, trigger: 'change', }],
-  sizeType: [{ required: true, trigger: 'change', }],
-};
-const state = ref({
-  typeList: [],
-  tariffIdList: [],
-  formState: {
-    "label": "",
-    "trafficPoolType": status.value,
-    "source": "",
-    "status": "",
-    "simTariffId": null,
-    "expireTime": "",
-    // "iccids": [],
-    "size": null,
-    "sizeType": ""
-  },
-  card: [],
-  formRef: null,
-  sourceList: [],
-  trafficList: [],
-  SelectAll: false
-})
-
-const { typeList, tariffIdList, formState, card, formRef, sourceList, trafficList, SelectAll } = toRefs(state.value)
-
-// 提交
-const handleSubmit = ({ values, errors }) => {
-  formRef.value.validate(async (errors) => {
-    if (!errors) {
-      values.size = Number(values.size)
-      if (status.value == 1) {
-        delete formState.value.sizeType
-        delete formState.value.size
-      }
-      if (formState.value.id) {
-        const { code, data } = await updateTrafficPool(formState.value)
-
-        if (code == 200) {
-          Message.success({
-            content: t('setting.editSuccess'),
-            duration: 2000,
-          })
-          resetForm()
-          emit('submit', true)
-        }
-      } else {
-        const { code, data } = await addTrafficPool(formState.value)
-        if (code == 200) {
-          Message.success({
-            content: t('setting.addSuccess'),
-            duration: 2000,
-          })
-          resetForm()
-          emit('submit', true)
-        }
-      }
-    }
-  });
-}
-
-
-watch(() => formState.value.source, (val, newVal) => {
-  if (val !== newVal) {
-    formState.value.simTariffId = null
-    handleTariff(val)
-  }
-})
-
-// 获取资费列表选择id
-const handleTariff = async (item) => {
-  const { code, data } = await tariffList({
-    "current": 1,
-    size: 1000000,
-    source: item
-  })
-  if (code == 200) {
-    tariffIdList.value = (data.records || []).map(item => {
-      return {
-        ...item,
-        value: item.id,
-        label: item.label + '---' + item.userName
-      }
-    })
-  }
-}
-
-// 取消
-const resetForm = () => {
-  emit('update:modelValue', false)
-  formState.value = {
-    "label": "",
-    "trafficPoolType": "2",
-    "source": "",
-    "status": "",
-    "simTariffId": null,
-    "expireTime": "",
-    // "iccids": [],
-    "size": null,
-    "sizeType": ""
-  }
-}
-
-// 获取字典
-const handleDictValue = async () => {
-  sourceList.value = await Getdictionary('source')
-  trafficList.value = await Getdictionary('trafficPacketStatus')
-  typeList.value = await Getdictionary('trafficPoolType')
-}
-
-const recordVal = (item) => {
-  const datas = JSON.parse(JSON.stringify(item))
-  if (props.typeCurrent == 2) {
-    formState.value = datas
-  }
-}
-
-watch(() => modelValue.value, val => {
-  if (val) {
-    handleDictValue()
-    handleTariff()
-    recordVal(record.value)
-  }
-})
-
-</script>
-
-<template>
-  <a-modal :render-to-body="false" unmount-on-close
-    :title="typeCurrent == 1 ? $t('form.Add') : typeCurrent == 2 ? $t('form.Edit') : $t('flowPool.Detail')"
-    v-model:visible="modelValue" @cancel="resetForm" centered :maskClosable="false" :footer="null" width="55%">
-    <a-tabs v-model:active-key="activeKey">
-      <a-tab-pane key="1" :title="$t('flowPool.infoTabs')">
-        <a-form ref="formRef" :rules="rules" :model="formState" @submit="handleSubmit" style="width: 620px;">
-          <a-form-item :label="$t('flowPool.label')" field="label">
-            <a-input v-model="formState.label"
-              :placeholder="$t('form.datapoolForm.pleaseSelect') + $t('flowPool.label')" />
-          </a-form-item>
-          <a-form-item :label="$t('flowPool.source')" field="source">
-            <a-select v-model="formState.source"
-              :placeholder="$t('form.datapoolForm.pleaseSelect') + $t('flowPool.source')">
-              <a-option v-for="item in sourceList" :key="item.id" :value="item.value">{{
-                item.label
-              }}
-              </a-option>
-            </a-select>
-          </a-form-item>
-          <a-form-item :label="$t('flowPool.trafficPoolStatus')" field="status">
-            <a-select v-model="formState.status"
-              :placeholder="$t('form.datapoolForm.pleaseSelect') + $t('flowPool.trafficPoolStatus')">
-              <a-option v-for="item in trafficList" :key="item.id" :value="item.value">{{
-                item.label
-              }}
-              </a-option>
-            </a-select>
-          </a-form-item>
-          <a-form-item :label="$t('flowPool.simRariff')" field="simTariffId">
-            <a-select v-model="formState.simTariffId" @change="selectChange"
-              :placeholder="$t('form.datapoolForm.pleaseSelect') + $t('flowPool.simRariff')">
-              <a-option v-for="item in tariffIdList" :key="item.id" :value="item.value">{{
-                item.label
-              }}
-              </a-option>
-            </a-select>
-          </a-form-item>
-          <a-form-item :label="$t('flowPool.expireTime')" field="expireTime">
-            <a-date-picker v-model="formState.expireTime" show-time :time-picker-props="{ defaultValue: '09:09:06' }"
-              format="YYYY-MM-DD HH:mm:ss" />
-          </a-form-item>
-          <a-form-item :label="$t('flowPool.poolSize')" field="size" v-if="status == 2">
-            <a-input v-model="formState.size" :placeholder="$t('flowPool.poolSize')" />
-            <a-select v-model="formState.sizeType" style="width: 80px; margin-left: 8px;">
-              <a-option value="KB">KB</a-option>
-              <a-option value="MB">MB</a-option>
-              <a-option value="GB">GB</a-option>
-            </a-select>
-          </a-form-item>
-          <a-form-item>
-            <a-button type="primary" html-type="submit" style="margin-right: 10px;">{{
-              $t('form.Confirm')
-            }}
-            </a-button>
-            <a-button @click="resetForm">{{ $t('form.Cancel') }}</a-button>
-          </a-form-item>
-        </a-form>
-      </a-tab-pane>
-    </a-tabs>
-
-  </a-modal>
-</template>
-
-<style scoped lang="less"></style>

+ 0 - 279
src/views/admin/flowPool/components/forewarning.vue

@@ -1,279 +0,0 @@
-<script setup>
-import { ref, onMounted, toRefs, toRef, watch, defineExpose } from 'vue';
-import { Message } from "@arco-design/web-vue";
-import { Getdictionary } from '@/mixins/index.js'
-import { createWarning, updateWarning } from '@/api/path/flowPool.api.js'
-import { useI18n } from 'vue-i18n'
-
-const { t } = useI18n()
-const props = defineProps({
-  modelValue: {
-    type: Boolean,
-    default: false
-  },
-  FormDataList: {
-    type: Object,
-    default: () => ({})
-  }
-})
-const modelValue = toRef(props, 'modelValue')
-const FormDataList = toRef(props, 'FormDataList')
-const emit = defineEmits(['update:modelValue', 'submit'])
-const state = ref({
-  formWarning: {
-    "userId": null, // 用户ID
-    "poolId": null, // 流量池ID
-    "clientPooPc": null, // 客户端-池预警设置:端流量池预计
-    "clientPooPcWarnSwitch": false, // 客户端-池预警设置:达量预警
-    // "clientPooPcStop": "", // 客户端-池预警设置:达量停机
-    // "clientPooPcStopSwitch": false, // 客户端-池预警设置:达量停机开关
-    "clientPooPcStopNetwork": "", // 客户端-池预警设置:达量断网
-    "clientPooPcStopNetworkSwitch": false, // 客户端-池预警设置:达量断网开关
-    "clientNotifyNumber": null, // 客户端-池预警设置:通知次数 次/月
-    "clientSingleCardWarn": "", // 客户端-单卡预警设置:单卡预警 M
-    "clientSingleCardWarnSwitch": false, // 客户端-单卡预警设置:单卡预警 M 开关
-    // "clientSingleCardWarnStop": "", // 客户端-单卡预警设置:达量停机
-    // "clientSingleCardWarnStopSwitch": false, // 客户端-单卡预警设置:达量停机开关
-    "clientSingleCardWarnStopNetwork": "", // 客户端-单卡预警设置:达量断网
-    "clientSingleCardWarnStopNetworkSwitch": false, // 客户端-单卡预警设置:达量断网开关
-    "manageWarn": null, // 管理端-预警设置:单卡预警 M
-    "manageWarnSwitch": false, // 管理端-预警设置:单卡预警 M 开关
-    // "manageWarnSwitchStop": "", // 管理端-预警设置:达量停机
-    // "manageWarnSwitchStopSwitch": false, // 管理端-预警设置:达量停机开关
-    "manageWarnStopNetwork": "", // 管理端-预警设置:达量断网
-    "manageWarnStopNetworkSwitch": false // 管理端-预警设置:达量断网开关
-  },
-  formRef: null,
-  earlyList: []
-})
-
-const { formWarning, formRef, earlyList } = toRefs(state.value)
-
-const rules = {
-  clientPooPc: [{ required: true, trigger: 'change', }],
-  // clientPooPcStop: [{ required: true, trigger: 'change', }],
-  clientPooPcStopNetwork: [{ required: true, trigger: 'change', }],
-  clientNotifyNumber: [{ required: true, trigger: 'change', }],
-  clientSingleCardWarn: [{ required: true, trigger: 'change', }],
-  // clientSingleCardWarnStop: [{ required: true, trigger: 'change', }],
-  clientSingleCardWarnStopNetwork: [{ required: true, trigger: 'change', }],
-  manageWarn: [{ required: true, trigger: 'change', }],
-  // manageWarnSwitchStop: [{ required: true, trigger: 'change', }],
-  manageWarnStopNetwork: [{ required: true, trigger: 'change', }],
-};
-
-// 取消
-const resetForm = () => {
-  emit('update:modelValue', false)
-  formWarning.value = {
-    "userId": null, // 用户ID
-    "clientPooPc": null, // 客户端-池预警设置:端流量池预计
-    "clientPooPcWarnSwitch": false, // 客户端-池预警设置:达量预警
-    // "clientPooPcStop": "", // 客户端-池预警设置:达量停机
-    // "clientPooPcStopSwitch": false, // 客户端-池预警设置:达量停机开关
-    "clientPooPcStopNetwork": "", // 客户端-池预警设置:达量断网
-    "clientPooPcStopNetworkSwitch": false, // 客户端-池预警设置:达量断网开关
-    "clientNotifyNumber": null, // 客户端-池预警设置:通知次数 次/月
-    "clientSingleCardWarn": "", // 客户端-单卡预警设置:单卡预警 M
-    "clientSingleCardWarnSwitch": false, // 客户端-单卡预警设置:单卡预警 M 开关
-    // "clientSingleCardWarnStop": "", // 客户端-单卡预警设置:达量停机
-    // "clientSingleCardWarnStopSwitch": false, // 客户端-单卡预警设置:达量停机开关
-    "clientSingleCardWarnStopNetwork": "", // 客户端-单卡预警设置:达量断网
-    "clientSingleCardWarnStopNetworkSwitch": false, // 客户端-单卡预警设置:达量断网开关
-    "manageWarn": null, // 管理端-预警设置:单卡预警 M
-    "manageWarnSwitch": false, // 管理端-预警设置:单卡预警 M 开关
-    // "manageWarnSwitchStop": "", // 管理端-预警设置:达量停机
-    // "manageWarnSwitchStopSwitch": false, // 管理端-预警设置:达量停机开关
-    "manageWarnStopNetwork": "", // 管理端-预警设置:达量断网
-    "manageWarnStopNetworkSwitch": false // 管理端-预警设置:达量断网开关
-  }
-  FormDataList.value = {}
-}
-
-const handleSubmit = ({ values, error }) => {
-  formRef.value.validate(async (errors) => {
-    if (!errors) {
-      Object.keys(formWarning.value).forEach(key => {
-        if (typeof formWarning.value[key] === 'boolean') {
-          formWarning.value[key] = formWarning.value[key] ? "1" : "2";
-        }
-      });
-      formWarning.value.clientPooPc = Number(formWarning.value.clientPooPc)
-      formWarning.value.clientNotifyNumber = Number(formWarning.value.clientNotifyNumber)
-      formWarning.value.manageWarn = Number(formWarning.value.manageWarn)
-      formWarning.value.clientSingleCardWarn = String(formWarning.value.clientSingleCardWarn)
-      let res = formWarning.value.id ? await updateWarning(formWarning.value) : await createWarning(formWarning.value)
-      if (res.code === 200) {
-        Message.success(t('setting.ControlsSuccess'))
-        emit('update:modelValue', false)
-        emit('submit', true)
-        resetForm()
-      }
-    } else {
-      console.error('Validation failed', errors);
-    }
-  })
-}
-
-const handleDictValue = async () => {
-  earlyList.value = await Getdictionary('forewarning')
-}
-
-
-const detaile = (val)=>{
-  formWarning.value.userId = val.userId;
-  formWarning.value.poolId = val.id;
-
-  if (val.alert && val.alert.id !== '') {
-    Object.keys(formWarning.value).forEach(key => {
-      if (typeof formWarning.value[key] === 'boolean') {
-        formWarning.value[key] = val.alert[key] == 1;
-      } else {
-        formWarning.value[key] = val.alert[key];
-      }
-    });
-    formWarning.value.clientSingleCardWarn = Number(formWarning.value.clientSingleCardWarn)
-  }
-  if (val.alert.id !== '') {
-    formWarning.value.id = val.alert.id
-  }
-}
-
-defineExpose({detaile})
-
-onMounted(() => {
-  handleDictValue()
-})
-</script>
-
-<template>
-  <a-modal :title="$t('forewarning.forewarning')" v-model:visible="modelValue" @cancel="resetForm" centered
-    :maskClosable="false" :footer="null" width="55%">
-    <a-tabs>
-      <a-tab-pane key="1" :title="$t('forewarning.PoolEarlyWarning')">
-        <a-form :model="formWarning" direction="inline" ref="formRef" :rules="rules">
-          <div class="form-pool-tit">
-            <div class="pool-icon"></div>
-            {{ $t('forewarning.clientWarning') }}
-          </div>
-          <a-form-item field="clientPooPc" :label="$t('forewarning.TakeUpOf')">
-            <a-input-number v-model="formWarning.clientPooPc" :style="{ width: '320px' }"
-              :placeholder="$t('forewarning.PleaseEnter')" allow-clear hide-button>
-              <template #suffix>
-                %
-              </template>
-            </a-input-number>
-            <a-checkbox v-model="formWarning.clientPooPcWarnSwitch">{{ $t('forewarning.reach') }}</a-checkbox>
-          </a-form-item>
-          <!-- <a-form-item field="clientPooPcStop" :label="$t('forewarning.ShutDown')">
-            <a-select v-model="formWarning.clientPooPcStop" :placeholder="$t('forewarning.PleaseEnter')" :style="{ width: '320px' }" allow-clear>
-              <a-option v-for="item in earlyList" :key="item.value" :value="item.value" :label="item.label" />
-            </a-select>
-            <a-checkbox v-model="formWarning.clientPooPcStopSwitch">{{ $t('forewarning.ShutDown') }}</a-checkbox>
-          </a-form-item> -->
-          <a-form-item field="clientArriveStopNetwork" :label="$t('forewarning.NetworkOutage')">
-            <a-select v-model="formWarning.clientPooPcStopNetwork" :placeholder="$t('forewarning.PleaseSelect')"
-              :style="{ width: '320px' }" allow-clear>
-              <a-option v-for="item in earlyList" :key="item.value" :value="item.value" :label="item.label" />
-            </a-select>
-            <a-checkbox v-model="formWarning.clientPooPcStopNetworkSwitch">{{ $t('forewarning.NetworkOutage')
-              }}</a-checkbox>
-          </a-form-item>
-          <a-form-item field="clientNotifyNumber" :label="$t('forewarning.ReminderTimes')">
-            <a-input-number v-model="formWarning.clientNotifyNumber" :style="{ width: '320px' }"
-              :placeholder="$t('forewarning.PleaseEnter')" allow-clear hide-button>
-              <template #suffix>
-                {{ $t('forewarning.TimesMonth') }}
-              </template>
-            </a-input-number>
-          </a-form-item>
-          <div class="form-pool-tit">
-            <div class="pool-icon"></div>
-            {{ $t('forewarning.SingleCard') }}
-          </div>
-          <a-form-item field="clientSingleCardWarn" :label="$t('forewarning.SingleCardUsage')">
-            <a-input-number v-model="formWarning.clientSingleCardWarn" :style="{ width: '320px' }"
-              :placeholder="$t('forewarning.PleaseEnter')" allow-clear hide-button>
-              <template #suffix>
-                %
-              </template>
-            </a-input-number>
-            <a-checkbox v-model="formWarning.clientSingleCardWarnSwitch">{{ $t('forewarning.reach') }}</a-checkbox>
-          </a-form-item>
-          <!-- <a-form-item field="clientSingleCardWarnStop" :label="$t('forewarning.ShutDown')">
-            <a-select v-model="formWarning.clientSingleCardWarnStop" :placeholder="$t('forewarning.PleaseSelect')" :style="{ width: '320px' }"
-              allow-clear>
-              <a-option v-for="item in earlyList" :key="item.value" :value="item.value" :label="item.label" />
-            </a-select>
-            <a-checkbox v-model="formWarning.clientSingleCardWarnStopSwitch">{{$t('forewarning.ShutDown')}}</a-checkbox>
-          </a-form-item> -->
-          <a-form-item field="clientSingleCardWarnStopNetwork" :label="$t('forewarning.NetworkOutage')">
-            <a-select v-model="formWarning.clientSingleCardWarnStopNetwork"
-              :placeholder="$t('forewarning.PleaseSelect')" :style="{ width: '320px' }" allow-clear>
-              <a-option v-for="item in earlyList" :key="item.value" :value="item.value" :label="item.label" />
-            </a-select>
-            <a-checkbox
-              v-model="formWarning.clientSingleCardWarnStopNetworkSwitch">{{ $t('forewarning.NetworkOutage') }}</a-checkbox>
-          </a-form-item>
-          <div class="form-pool-tit">
-            <div class="pool-icon"></div>
-            {{ $t('forewarning.ManagementSide') }}
-          </div>
-          <a-form-item field="manageWarn" :label="$t('forewarning.consumed')">
-            <a-input-number v-model="formWarning.manageWarn" :style="{ width: '320px' }"
-              :placeholder="$t('forewarning.PleaseEnter')" allow-clear hide-button>
-              <template #suffix>
-                %
-              </template>
-            </a-input-number>
-            <a-checkbox v-model="formWarning.manageWarnSwitch">{{ $t('forewarning.reach') }}</a-checkbox>
-          </a-form-item>
-          <!-- <a-form-item field="manageWarnSwitchstop" :label="$t('forewarning.ShutDown')">
-            <a-select v-model="formWarning.manageWarnSwitchStop" :placeholder="$t('forewarning.PleaseSelect')" :style="{ width: '320px' }"
-              allow-clear>
-              <a-option v-for="item in earlyList" :key="item.value" :value="item.value" :label="item.label" />
-            </a-select>
-            <a-checkbox v-model="formWarning.manageWarnSwitchStopSwitch">{{ $t('forewarning.ShutDown') }}</a-checkbox>
-          </a-form-item> -->
-          <a-form-item field="manageWarnStopNetwork" :label="$t('forewarning.NetworkOutage')">
-            <a-select v-model="formWarning.manageWarnStopNetwork" :placeholder="$t('forewarning.PleaseSelect')"
-              :style="{ width: '320px' }" allow-clear>
-              <a-option v-for="item in earlyList" :key="item.value" :value="item.value" :label="item.label" />
-            </a-select>
-            <a-checkbox v-model="formWarning.manageWarnStopNetworkSwitch">{{ $t('forewarning.NetworkOutage')
-              }}</a-checkbox>
-          </a-form-item>
-          <a-form-item>
-            <a-button type="primary" @click="handleSubmit" style="margin-right: 10px;">{{
-              $t('form.Confirm')
-            }}
-            </a-button>
-            <a-button @click="resetForm">{{ $t('form.Cancel') }}</a-button>
-          </a-form-item>
-        </a-form>
-      </a-tab-pane>
-      <!-- <a-tab-pane key="2" title="卡预警">
-
-      </a-tab-pane> -->
-    </a-tabs>
-  </a-modal>
-</template>
-
-<style scoped lang="less">
-.form-pool-tit {
-  display: flex;
-  align-items: center;
-  margin-bottom: 10px;
-
-  .pool-icon {
-    margin-right: 10px;
-    width: 4px;
-    height: 16px;
-    background: #1B5DF8;
-    font-size: 14px;
-    color: #6C6E70;
-    font-family: PingFang SC;
-
-  }
-}
-</style>

+ 0 - 189
src/views/admin/flowPool/components/openExport.vue

@@ -1,189 +0,0 @@
-<template>
-    <a-modal v-model:visible="modelValue" @ok="handleOk" @cancel="handleCancel" width="1000px">
-        <template #title>
-            批量导入
-        </template>
-        <div class="export-box">
-            <div class="export-box-item">
-                <div class="box-item-title">
-                    <div class="title-icon"></div>
-                    批量导入
-                </div>
-                <div class="box-item-content">
-                    <a-form :model="searchForm">
-                        <a-form-item field="label" :label="$t('flowPool.label')">
-                            <a-input v-model="searchForm.label"
-                                :placeholder="$t('lotCard.please') + $t('flowPool.label')" allow-clear />
-                        </a-form-item>
-                        <a-form-item field="label" :label="$t('flowPool.status')">
-                            <a-select v-model="value" :style="{ width: '240px' }"
-                                :placeholder="$t('flowPool.flowPoolStatus')">
-                                <a-option v-for="item of trafficList" :value="item.id" :label="item.label" />
-                            </a-select>
-                        </a-form-item>
-                        <a-form-item field="label" :label="$t('flowPool.operator')">
-                            <a-select v-model="value" :style="{ width: '240px' }"
-                                :placeholder="$t('flowPool.operatorName')">
-                                <a-option v-for="item of sourceList" :value="item.id" :label="item.label" />
-                            </a-select>
-                        </a-form-item>
-                        <a-form-item field="label" :label="$t('flowPool.start_time')">
-                            <a-date-picker style="width: 200px;" :placeholder="$t('flowPool.start_timeName')" />
-                        </a-form-item>
-                    </a-form>
-                </div>
-            </div>
-            <div class="export-box-item" style="margin-top:20px;">
-                <div class="box-item-title">
-                    <div class="title-icon"></div>
-                    导入结果
-                </div>
-                <div class="box-item-content">
-                    <a-table :columns="columnsExport" :data="dataExport" :pagination="paginationCard"
-                        :scroll="{ x: 'auto' }" @page-change="evChangePageCard">
-                        <template #operate="{ record }">
-                            <a-button @click="openContract(record)" type="text">下载</a-button>
-                        </template>
-                        <template #status="{ record }">
-                            <div class="export-status" v-if="record.status == 1">
-                                <div class="status-icon" style="background: rgba(82, 196, 27, 1);"></div>
-                                导入成功
-                            </div>
-                            <div class="export-status" v-if="record.status == 2">
-                                <div class="status-icon" style="background: rgba(250, 173, 20, 1);"></div>
-                                部分成功
-                            </div>
-                            <div class="export-status" v-if="record.status == 3">
-                                <div class="status-icon" style="background: rgba(247, 66, 75, 1);"></div>
-                                校验失败
-                            </div>
-                        </template>
-                    </a-table>
-                </div>
-            </div>
-        </div>
-    </a-modal>
-</template>
-
-<script setup>
-import { ref, onMounted, toRefs, toRef, watch } from 'vue';
-const props = defineProps({
-    modelValue: {
-        type: Boolean,
-        default: false
-    },
-})
-
-const modelValue = toRef(props, 'modelValue')
-const emit = defineEmits(['update:modelValue', 'submit'])
-
-const columnsExport = [
-    { title: '序号', dataIndex: 'index', align: 'center', render: ({ rowIndex }) => rowIndex + 1 },
-    {
-        title: '操作人',
-        dataIndex: 'name',
-    },
-    {
-        title: '导入时间',
-        dataIndex: 'exportTime',
-    },
-    {
-        title: '完成时间',
-        dataIndex: 'successTime',
-    },
-    {
-        title: '状态',
-        slotName: 'status',
-        align: 'center'
-    },
-    { title: '操作', slotName: 'operate', align: 'center' },
-];
-
-const state = ref({
-    dataExport: [],
-    paginationCard: {
-        total: 0,
-        pageSize: 10,
-        current: 1,
-    },
-    searchForm: {
-        "label": "",
-        "trafficPoolType": "1"
-    }
-})
-
-const { dataExport, paginationCard,searchForm } = toRefs(state.value)
-
-
-// 卡信息
-const evChangePageCard = (page) => {
-    paginationCard.value.current = page
-    intData()
-}
-</script>
-<style scoped lang="less">
-.export-box {
-  .export-box-item {
-    .box-item-title {
-      display: flex;
-      align-items: center;
-      font-family: PingFang SC;
-      font-size: 16px;
-      font-weight: 600;
-      line-height: 24px;
-      color: rgba(0, 0, 0, 0.85);
-      margin-bottom: 10px;
-
-      .title-icon {
-        margin-right: 10px;
-        width: 4px;
-        height: 16px;
-        background: #1B5DF8;
-
-      }
-    }
-
-    .box-item-content {
-      .item-txt {
-        display: flex;
-        align-items: center;
-        margin-bottom: 10px;
-
-        .item-txt-title {
-          width: 300px;
-          text-align: right;
-          margin-right: 10px;
-        }
-
-        .item-txt-text {
-          font-family: PingFang SC;
-          font-size: 14px;
-          font-weight: 400;
-          line-height: 22px;
-          text-align: left;
-          color: #1B5DF8;
-
-        }
-      }
-
-      .export-status {
-        font-family: PingFang SC;
-        font-size: 14px;
-        font-weight: 400;
-        line-height: 22px;
-        text-align: left;
-        color: rgba(51, 51, 51, 1);
-        display: flex;
-        align-items: center;
-
-        .status-icon {
-          width: 6px;
-          height: 6px;
-          border-radius: 50%;
-          margin-right: 10px;
-        }
-      }
-    }
-  }
-}
-</style>

+ 0 - 270
src/views/admin/flowPool/config.js

@@ -1,270 +0,0 @@
-export const columns = [
-  {
-    title: window.$t("flowPool.poolNumber"),
-    dataIndex: "id",
-    align: "center",
-    ellipsis: true,
-    width: 50,
-  },
-  {
-    title: '客户名称',
-    dataIndex: "userName",
-    align: "center",
-    width: 200,
-    tooltip: true,
-    ellipsis: true,
-  },
-  {
-    title: window.$t("flowPool.label"),
-    dataIndex: "label",
-    align: "center",
-    width: 200,
-    tooltip: true,
-    ellipsis: true,
-  },
-  {
-    title: window.$t("flowPool.trafficPoolStatus"),
-    slotName: "status",
-    align: "center",
-    width: 200,
-    tooltip: true,
-    ellipsis: true,
-  },
-  {
-    title: window.$t("flowPool.source"),
-    dataIndex: "sourceName",
-    align: "center",
-    width: 200,
-    tooltip: true,
-    ellipsis: true,
-  },
-  {
-    title: window.$t("flowPool.tariffName"),
-    dataIndex: "simTariffName",
-    align: "center",
-    width: 200,
-    tooltip: true,
-    ellipsis: true,
-  },
-  {
-    title: window.$t("flowPool.ActivatedName"),
-    dataIndex: "Activated",
-    align: "center",
-    width: 200,
-    tooltip: true,
-    ellipsis: true,
-  },
-  {
-    title: window.$t("flowPool.HaveBeenUsedName")+`(${'GB'})`,
-    dataIndex: "dataUsage",
-    align: "center",
-    width: 200,
-    tooltip: true,
-    ellipsis: true,
-  },
-  {
-    title: window.$t("flowPool.updated_at"),
-    dataIndex: "updatedAt",
-    align: "center",
-    width: 200,
-    tooltip: true,
-    ellipsis: true,
-  },
-  {
-    title: window.$t("global.common.operations"),
-    slotName: "id",
-    align: "center",
-    width: 250,
-    fixed: "right",
-  },
-];
-
-export const columnsAfter = [
-  {
-    title: window.$t("flowPool.poolNumber"),
-    dataIndex: "id",
-    align: "center",
-    ellipsis: true,
-    width: 50,
-  },
-  {
-    title: '客户名称',
-    dataIndex: "userName",
-    align: "center",
-    width: 200,
-    tooltip: true,
-    ellipsis: true,
-  },
-  {
-    title: window.$t("flowPool.label"),
-    dataIndex: "label",
-    align: "center",
-    width: 200,
-    tooltip: true,
-    ellipsis: true,
-  },
-  {
-    title: window.$t("flowPool.trafficPoolStatus"),
-    slotName: "status",
-    align: "center",
-    width: 200,
-    tooltip: true,
-    ellipsis: true,
-  },
-  {
-    title: window.$t("flowPool.source"),
-    dataIndex: "sourceName",
-    align: "center",
-    width: 200,
-    tooltip: true,
-    ellipsis: true,
-  },
-  {
-    title: window.$t("flowPool.tariffName"),
-    dataIndex: "simTariffName",
-    align: "center",
-    width: 200,
-    tooltip: true,
-    ellipsis: true,
-  },
-  {
-    title: "池大小",
-    dataIndex: "sizeNum",
-    align: "center",
-    width: 200,
-    tooltip: true,
-    ellipsis: true,
-  },
-  {
-    title: window.$t("flowPool.ActivatedName"),
-    dataIndex: "Activated",
-    align: "center",
-    width: 200,
-    tooltip: true,
-    ellipsis: true,
-  },
-  {
-    title: window.$t("flowPool.HaveBeenUsedName")+`(${'GB'})`,
-    dataIndex: "dataUsage",
-    align: "center",
-    width: 200,
-    tooltip: true,
-    ellipsis: true,
-  },
-  {
-    title: window.$t("flowPool.updated_at"),
-    dataIndex: "updatedAt",
-    align: "center",
-    width: 200,
-    tooltip: true,
-    ellipsis: true,
-  },
-  {
-    title: window.$t("global.common.operations"),
-    slotName: "id",
-    align: "center",
-    width: 250,
-    fixed: "right",
-  },
-];
-
-export const SearchFormList = [
-  {
-    type: "input",
-    label: "流量池名称",
-    field: "label",
-    value: "", // 双向绑定的值
-  },
-  {
-    type: "select",
-    label: "流量池状态",
-    field: "status",
-    options: [], // 默认空,后面会通过字典加载
-    dict: "trafficPacketStatus",
-    value: "", // 双向绑定的值
-    width: "200",
-  },
-  {
-    type: "select",
-    label: "运营商名称",
-    field: "source",
-    options: [], // 默认空,后面会通过字典加载
-    dict: "source",
-    value: "", // 双向绑定的值
-    width: "200",
-  },
-  {
-    type: "input",
-    label: "资费名称",
-    field: "tariffName",
-    value: "", // 双向绑定的值
-  },
-  {
-    type: "range-picker",
-    label: "更新日期",
-    field: "updatedAt",
-    value: [], // 双向绑定的值
-    width: "240",
-  },
-];
-
-
-
-
-
-
-// 流量池
-export const columnsFlowOperationLog = [
-  { title: window.$t('flowPool.poolNumber'), dataIndex: 'id', align: 'center', ellipsis:true,width: 50 },
-  { title: '池类型', dataIndex: 'trafficPoolType', align: 'center', ellipsis:true,width: 50 },
-  { title: window.$t('flowPool.label'), dataIndex: 'label', align: 'center', width: 200 ,tooltip:true,ellipsis:true},
-  { title: window.$t('flowPool.trafficPoolStatus'), slotName: 'status', align: 'center', width: 200 ,tooltip:true,ellipsis:true},
-  { title: window.$t('flowPool.source'), dataIndex: 'sourceName', align: 'center', width: 200 ,tooltip:true,ellipsis:true},
-  { title: window.$t('flowPool.tariffName'), dataIndex: 'simTariffName', align: 'center', width: 200 ,tooltip:true,ellipsis:true},
-  { title:'池大小', dataIndex: 'size', align: 'center', width: 200 ,tooltip:true,ellipsis:true},
-  { title: window.$t('flowPool.ActivatedName'),dataIndex:'Activated', align: 'center', width: 200 ,tooltip:true,ellipsis:true},
-  { title: window.$t('flowPool.HaveBeenUsedName'), dataIndex: 'HaveBeenUsed', align: 'center', width: 200 ,tooltip:true,ellipsis:true},
-  { title: window.$t('flowPool.updated_at'), dataIndex: 'updatedAt', align: 'center', width: 200,tooltip:true,ellipsis:true },
-]
-
-
-export const SearchFormListOperationLog= [
-  {
-    type: "input",
-    label: "流量池名称",
-    field: "label",
-    value: "", // 双向绑定的值
-  },
-  {
-    type: "select",
-    label: "流量池状态",
-    field: "status",
-    options: [], // 默认空,后面会通过字典加载
-    dict: "trafficPacketStatus",
-    value: "", // 双向绑定的值
-    width: "200",
-  },
-  {
-    type: "select",
-    label: "运营商名称",
-    field: "source",
-    options: [], // 默认空,后面会通过字典加载
-    dict: "source",
-    value: "", // 双向绑定的值
-    width: "200",
-  },
-  {
-    type: "input",
-    label: "资费名称",
-    field: "tariffName",
-    value: "", // 双向绑定的值
-  },
-  {
-    type: "range-picker",
-    label: "更新日期",
-    field: "updatedAt",
-    value: "", // 双向绑定的值
-    width: "240",
-  },
-];
-

+ 0 - 292
src/views/admin/flowPool/rearFlowPool/index.vue

@@ -1,292 +0,0 @@
-<!-- 后流量池 -->
-<template>
-  <div class="container">
-    <!-- 搜索条件区 -->
-    <div class="search-section">
-      <Search :SearchForm="SearchFormList" @query="initData" @reset="reset"></Search>
-    </div>
-
-    <div class="audit-btn">
-      <a-button @click="dictShowModel(1, null)" type="text">
-        <template #icon>
-          <icon-plus-circle />
-        </template>
-        <template #default>
-          {{ $t("form.Add") }}
-        </template>
-      </a-button>
-    </div>
-
-    <a-table row-key="id" :data="tableData" :columns="columnsAfter" :pagination="pagination" :scroll="{ x: 'auto' }"
-      @page-change="evChangePage">
-      <template #id="{ record }">
-        <!-- 修改 -->
-        <a class="a-link" href="javascript:;" style="margin-right: 1rem" @click="dictShowModel(2, record)">{{
-          $t("form.Edit") }}</a>
-        <a class="a-link" href="javascript:;" style="margin-right: 1rem" @click="handelForewring(record)">{{
-          $t('flowPool.Waring') }}</a>
-        <!-- <a class="a-link" href="javascript:;" style="margin-right: 1rem" @click="handelgetCard(record)">导卡</a> -->
-        <!-- 删除 -->
-        <a-popconfirm :content="$t('form.Delete')" :ok-text="$t('form.Confirm')" :cancel-text="$t('form.Cancel')"
-          @ok="handleDel(record.id)">
-          <a class="a-link" href="javascript:;" style="margin-right: 1rem">{{
-            $t("form.Delete")
-          }}</a>
-        </a-popconfirm>
-      </template>
-      <template #status="{ record }">
-        <a-tag :color="record.status == 1 ? '#00b42a' : '#f53f3f'">{{ trafficList.find(val => val.value ==
-          record.status)?.label }}</a-tag>
-      </template>
-    </a-table>
-    <add v-model:modelValue="showAdd" status="2" :typeCurrent="typeCurrent" :record="record" @submit="initData()"></add>
-    <Forewarning v-model:modelValue="visibleForewarning" ref="forewarning" @submit="initData()" />
-    <GuideCard v-model:model-value="ShowOpenExport" />
-  </div>
-</template>
-
-<script setup>
-import { onMounted, reactive, toRefs } from "vue";
-import { columnsAfter, SearchFormList } from "../config";
-import { Message } from "@arco-design/web-vue";
-import { deleteTrafficPool, lotCatdList } from "@/api/path/flowPool.api";
-import { useSystemStore } from "@/store/modules/systemStore";
-import add from "../components/add.vue";
-import Forewarning from "../components/forewarning.vue";
-import { Getdictionary, tableFunction, filterDict } from '@/mixins/index.js'
-import { useI18n } from 'vue-i18n'
-import Search from '@/components/Search/index.vue'
-import GuideCard from '../components/GuideCard.vue'
-const { t } = useI18n();
-const systemStore = useSystemStore();
-const state = reactive({
-  pagination: {
-    total: 0,
-    pageSize: 10,
-    current: 1,
-    trafficPoolType: "2",
-  },
-  role: systemStore.getRole,
-  typeCurrent: 1,
-  visibleForewarning: false,
-  record: {},
-  sourceList: [],
-  trafficList: [],
-  showAdd: false,
-  forewarning: null,
-  ShowOpenExport: false
-});
-
-const {
-  pagination,
-  role,
-  typeCurrent,
-  visibleForewarning,
-  record,
-  sourceList,
-  trafficList,
-  showAdd,
-  forewarning,
-  ShowOpenExport
-} = toRefs(state);
-
-
-const processData = (data) => {
-  return (data.records || []).map((item, index) => {
-    // 换算Gb
-    const afterFirstConversion = item.dataUsage / 1024
-    const afterSecondConversion = afterFirstConversion / 1024;
-    const result = Math.ceil(afterSecondConversion * 100) / 100;
-    const dataUsage = result.toFixed(2);
-    return { 
-      ...item,
-      sourceName: filterDict(sourceList.value, item.source), // 运营商名称
-      Activated: item.cardAct + "/" + item.iccidCount,
-      HaveBeenUsed: item.size + item.sizeType,
-      trafficPoolStatus: filterDict(trafficList.value, item.status),
-      sizeNum: item.size + '/' + item.sizeType,
-      dataUsage
-    };
-  })
-}
-
-const { tableData, evChangePage, initData, reset } = tableFunction(pagination.value, lotCatdList, processData)
-
-// 删除
-const handleDel = async (id) => {
-  const { code } = await deleteTrafficPool({ id });
-  if (code == 200) {
-    Message.success({
-      content: t('setting.deleteSuccess'),
-      duration: 2000,
-    });
-    initData();
-  }
-};
-
-// 弹框
-const dictShowModel = (type, data) => {
-  typeCurrent.value = type;
-  record.value = data;
-  showAdd.value = true;
-};
-
-const handelForewring = (item) => {
-  forewarning.value.detaile(item)
-  visibleForewarning.value = true;
-};
-
-const handleDictValue = async () => {
-  sourceList.value = await Getdictionary("source");
-  trafficList.value = await Getdictionary("trafficPacketStatus");
-};
-
-const handelgetCard = (item) => {
-  ShowOpenExport.value = true;
-}
-
-onMounted(async () => {
-  await handleDictValue();
-  await initData();
-});
-</script>
-
-<style scoped lang="less">
-.search-section {
-  margin-top: 20px;
-  margin-bottom: 20px;
-}
-
-.container {
-  .head-title {
-    display: flex;
-    justify-content: space-between;
-  }
-
-  .form-row {
-    display: flex;
-
-    .form-row-col {
-      width: 25%;
-      display: flex;
-      align-items: center;
-
-      .form-row-label {
-        width: 120px;
-        text-align: right;
-      }
-    }
-  }
-}
-
-silent-expire-alarm {
-  padding: 20px !important;
-  // background: #fcf;
-}
-
-.search-section {
-  margin-bottom: 20px;
-}
-
-.audit-btn {
-  margin-bottom: 10px;
-}
-
-.echarts-box {
-  // width: 100%;
-  display: flex;
-  justify-content: center;
-  overflow: hidden;
-
-  .chart-dom {
-    width: 700px !important;
-    height: 400px !important;
-  }
-}
-
-.form-item-space-item {
-  background-color: #f2f3f5;
-  display: flex;
-  align-items: center;
-  font-size: 14px;
-}
-
-.form-pool-tit {
-  display: flex;
-  align-items: center;
-  margin-bottom: 10px;
-
-  .pool-icon {
-    margin-right: 10px;
-    width: 4px;
-    height: 16px;
-    background: #1b5df8;
-    font-size: 14px;
-    color: #6c6e70;
-    font-family: PingFang SC;
-  }
-}
-
-.export-box {
-  .export-box-item {
-    .box-item-title {
-      display: flex;
-      align-items: center;
-      font-family: PingFang SC;
-      font-size: 16px;
-      font-weight: 600;
-      line-height: 24px;
-      color: rgba(0, 0, 0, 0.85);
-      margin-bottom: 10px;
-
-      .title-icon {
-        margin-right: 10px;
-        width: 4px;
-        height: 16px;
-        background: #1b5df8;
-      }
-    }
-
-    .box-item-content {
-      .item-txt {
-        display: flex;
-        align-items: center;
-        margin-bottom: 10px;
-
-        .item-txt-title {
-          width: 300px;
-          text-align: right;
-          margin-right: 10px;
-        }
-
-        .item-txt-text {
-          font-family: PingFang SC;
-          font-size: 14px;
-          font-weight: 400;
-          line-height: 22px;
-          text-align: left;
-          color: #1b5df8;
-        }
-      }
-
-      .export-status {
-        font-family: PingFang SC;
-        font-size: 14px;
-        font-weight: 400;
-        line-height: 22px;
-        text-align: left;
-        color: rgba(51, 51, 51, 1);
-        display: flex;
-        align-items: center;
-
-        .status-icon {
-          width: 6px;
-          height: 6px;
-          border-radius: 50%;
-          margin-right: 10px;
-        }
-      }
-    }
-  }
-}
-</style>

+ 0 - 228
src/views/admin/order/BuyCard/Card.vue

@@ -1,228 +0,0 @@
-<template>
-    <!-- 创建 -->
-    <a-modal v-model:visible="modelValue" :title="$t('order.CardPurchase')" width="600px"
-        @cancel="closeModal(showAudit, formState)" centered :maskClosable="false" :okText="$t('form.Confirm')"
-        :cancelText="$t('form.Cancel')" :footer="null">
-        <a-form ref="formRef" :rules="rules" :model="formState" @submit="submitPurchase">
-            <a-form-item field="customerName" :label="$t('lotCard.userName')">
-                <div class="audit-txt">{{ userName }}</div>
-            </a-form-item>
-            <a-form-item label="运营商" field="source">
-                <a-select v-model="formState.source" :style="{ width: '380px' }"
-                    :placeholder="$t('form.datapoolForm.pleaseSelect') + '运营商'">
-                    <a-option v-for="item in sourceList" :value="item.value" :label="item.label" />
-                </a-select>
-            </a-form-item>
-            <a-form-item label="套餐计划类型" field="isRecharge">
-                <a-radio-group v-model="formState.isRecharge" :options="optionsType" />
-            </a-form-item>
-            <a-form-item label="套餐计划名称" field="SimTerminalId">
-                <a-select v-model="formState.SimTerminalId" :style="{ width: '380px' }"
-                    :placeholder="$t('form.datapoolForm.pleaseSelect') + '套餐计划名称'">
-                    <a-option v-for="item in PackagePlan" :value="item.id" :label="item.label" />
-                </a-select>
-            </a-form-item>
-            <a-form-item :label="$t('lotCard.CardType')" field="cardType">
-                <a-select v-model="formState.simType" :style="{ width: '380px' }"
-                    :placeholder="$t('form.datapoolForm.pleaseSelect') + $t('lotCard.CardType')">
-                    <a-option v-for="item of orderType" :value="item.value" :label="item.label" />
-                </a-select>
-            </a-form-item>
-            <a-form-item :label="$t('lotCard.SilentPeriod')">
-                <a-select v-model="formState.periodOfSilence" :style="{ width: '380px' }"
-                    :placeholder="$t('form.datapoolForm.pleaseSelect') + $t('lotCard.SilentPeriod')">
-                    <a-option v-for="item of silenceOptions" :value="item.value" :label="item.label" />
-                </a-select>
-            </a-form-item>
-            <a-form-item :label="$t('lotCard.FormationPool')" field="flowPool">
-                <a-radio-group v-model="formState.isTrafficPool" :options="flowPoolData">
-                    <template #label="{ data }">
-                        <a-tag>{{ data.label }}</a-tag>
-                    </template>
-                </a-radio-group>
-            </a-form-item>
-            <a-form-item :label="$t('lotCard.FlowPool')" v-if="formState.isTrafficPool == 1" field="poolId">
-                <a-select v-model="formState.poolId" :style="{ width: '380px' }"
-                    :placeholder="$t('form.datapoolForm.pleaseSelect') + $t('lotCard.FlowPool')">
-                    <a-option v-for="item of FlowPool" :value="item.id" :label="item.label" />
-                </a-select>
-            </a-form-item>
-            <a-form-item :label="$t('lotCard.QuantityCardsPurchased')" field="num">
-                <a-input v-model="formState.quantity"
-                    :placeholder="$t('form.datapoolForm.pleaseSelect') + $t('lotCard.QuantityCardsPurchased')" />
-            </a-form-item>
-            <a-form-item>
-                <a-button type="primary" html-type="submit" style="margin-right: 10px;">{{ $t('form.Confirm')
-                    }}</a-button>
-                <a-button @click="closeModal(formState)">{{ $t('form.Cancel') }}</a-button>
-            </a-form-item>
-        </a-form>
-    </a-modal>
-</template>
-
-<script setup>
-import { ref, toRefs, defineProps, watch, toRef } from 'vue';
-import { tariffList, ExampleQueryTrafficPool, PackageSchedule } from "@/api/path/tariffManagement.api";
-import { Getdictionary ,} from '@/mixins/index.js'
-import { CardPurchase } from '@/api/path/order'
-import { Message } from '@arco-design/web-vue';
-import { useI18n } from 'vue-i18n'
-const { t } = useI18n();
-const props = defineProps({
-    modelValue: {
-        type: Boolean,
-        default: false
-    }
-})
-
-const modelValue = toRef(props, 'modelValue')
-const emit = defineEmits(['update:modelValue', 'submit'])
-const state = ref({
-    userName: JSON.parse(localStorage.getItem('user_login_information'))?.username,
-    showAudit: false,
-    formRef: null,
-    formState: {
-        source: null, // 来源
-        periodOfSilence: "", // 静默期
-        isTrafficPool: "1", // 是否是流量池 1:是 2:否
-        quantity: null, // 采购数量
-        simType: "",// 卡类型
-        poolId: null,
-        isRecharge: '1',
-        SimTerminalId: null
-    },
-    sourceList: [],
-    silenceOptions: [], // 沉默期
-    orderType: [], // 卡类型
-    flowPoolData: [], // 组池
-    tariffData: [],
-    FlowPool: [], // 流量池
-    optionsType: [],
-    PackagePlan: []
-})
-
-const { showAudit, formState, sourceList, silenceOptions, orderType, flowPoolData, userName, optionsType, tariffData, formRef, FlowPool, PackagePlan } = toRefs(state.value)
-
-const rules = {
-    source: [{ required: true, trigger: 'change', }],
-    SimTerminalId: [
-        {
-            required: true,
-            trigger: 'change',
-        },
-    ],
-    simType: [
-        {
-            required: true,
-            trigger: 'change',
-        },
-    ],
-    periodOfSilence: [
-        {
-            required: true,
-            trigger: 'change',
-        },
-    ],
-    isTrafficPool: [
-        {
-            required: true,
-            trigger: 'change',
-        },
-    ],
-    quantity: [
-        {
-            required: true,
-            trigger: 'change',
-        },
-    ],
-    poolId: [
-        {
-            required: true,
-            trigger: 'change',
-        },
-    ],
-    source: [
-        {
-            required: true,
-            trigger: 'change',
-        },
-    ],
-};
-
-const handleDictValue = async () => {
-
-    const dict = await Getdictionary(['source', 'cardType', 'silenceOf', 'groupPool', 'setMeal'])
-
-    // 分别将返回的数据保存到响应的 ref 变量中
-    sourceList.value = dict[0];
-    orderType.value = dict[1];
-    silenceOptions.value = dict[2];
-    flowPoolData.value = dict[3];
-    optionsType.value = dict[4];
-    getList(formState.value.isRecharge)
-
-}
-// 确认购卡
-const submitPurchase = ({ values, errors }) => {
-    formRef.value.validate(async (errors) => {
-        if (!errors) {
-            const data = {
-                source: String(formState.value.source),
-                SimTerminalId: formState.value.SimTerminalId,
-                quantity: Number(formState.value.quantity),
-                simType: formState.value.simType,
-                periodOfSilence: String(formState.value.periodOfSilence),
-                isTrafficPool: formState.value.isTrafficPool,
-                poolId: formState.value.poolId,
-                isRecharge: Number(formState.value.isRecharge)
-            }
-            CardPurchase(data).then(res => {
-                Message.success(res.message)
-                emit('submit', true)
-                closeModal()
-            })
-        }
-    })
-}
-
-const closeModal = (val) => {
-    emit('update:modelValue', false)
-    Object.keys(formState.value).forEach(key => {
-        formState.value[key] = ''
-    })
-    formState.value.isRecharge = '1'
-    formState.value.isTrafficPool = '1'
-}
-
-// 套餐计划
-const getList = async (val) => {
-    const param = {
-        current: 1,
-        size: 999,
-        isRecharge: Number(val)
-    }
-    let res = await PackageSchedule(param)
-    if (res.code === 200) {
-        PackagePlan.value = res.data.records;
-    }
-}
-
-// 流量池
-watch(() => formState.value?.isTrafficPool, val => {
-    if (val == 1) {
-        ExampleQueryTrafficPool().then(res => {
-            FlowPool.value = res.data
-        })
-    }
-}, { immediate: true })
-watch(() => modelValue.value, val => {
-    if (val) {
-        handleDictValue()
-    }
-})
-watch(() => formState.value.isRecharge, async val => {
-    formState.value.SimTerminalId = null
-    getList(val)
-}, { deep: true })
-</script>
-<style scoped></style>

+ 0 - 265
src/views/admin/order/BuyCard/detaile.vue

@@ -1,265 +0,0 @@
-<template>
-    <a-modal v-model:visible="modelValue" width="800px" :title="$t('order.OrderDetails')" :closable="false">
-        <div class="detail-box">
-            <div class="detail-item-box">
-                <div class="detail-item">
-                    <div class="item-label">{{ $t('order.OrderNum') }}</div>
-                    <div class="item-content">{{ FormDataList.id }}</div>
-                </div>
-                <div class="detail-item">
-                    <div class="item-label">{{ $t('lotCard.orderType') }}</div>
-                    <div class="item-content">
-                        <a-tag color="#168cff" v-if="FormDataList.tmsStatus == 1">{{ $t('order.unshipped') }}</a-tag>
-                        <a-tag color="#00b42a" v-if="FormDataList.tmsStatus == 2">{{ $t('order.shipped') }}</a-tag>
-                    </div>
-                </div>
-            </div>
-            <div class="detail-item-box">
-                <div class="detail-item">
-                    <div class="item-label">{{ $t('lotCard.operator') }}</div>
-                    <div class="item-content">{{ FormDataList.sourceName }}</div>
-                </div>
-                <div class="detail-item">
-                    <div class="item-label">套餐计划名称</div>
-                    <div class="item-content">{{ tariffForm.terminalName }}</div>
-                </div>
-            </div>
-            <div class="detail-item-box">
-                <div class="detail-item">
-                    <div class="item-label">{{ $t('order.CardType') }}</div>
-                    <div class="item-content">{{ FormDataList.cardType }}</div>
-                </div>
-                <div class="detail-item">
-                    <div class="item-label">{{ $t('order.FlowPool') }}</div>
-                    <div class="item-content">{{ FormDataList.isTrafficPool == 1 ? $t('lotCard.Yes') : $t('lotCard.No')
-                        }}</div>
-                </div>
-            </div>
-            <div class="detail-item-box">
-                <div class="detail-item">
-                    <div class="item-label">{{ $t('order.CardNum') }}</div>
-                    <div class="item-content">{{ dataDetail.length }} / {{ FormDataList.quantity }}
-                        <template v-if="!show">
-                            <a-button type="primary" @click="showCard = true" style="margin-left:10px;"
-                                v-if="userType == 1 && FormDataList.moderationStatus == 2">{{
-                                    $t('order.AllocationCardNumber') }}</a-button>
-                        </template>
-                    </div>
-                </div>
-            </div>
-        </div>
-        <div class="detail-table" v-if="!show">
-            <a-table :columns="columnsDetail" :data="dataDetail" />
-        </div>
-
-        <div class="progress" v-if="show">
-            <div class="title">{{ schedule }}</div>
-            <!-- <div class="cusrte">
-                <a-progress type="circle" :percent="(schedule / 100)" size="large" />
-            </div> -->
-        </div>
-
-        <template #footer>
-            <a-button @click="cancel">{{ $t('form.Cancel') }}</a-button>
-        </template>
-    </a-modal>
-
-
-    <!-- 分配卡号 -->
-    <a-modal v-model:visible="showCard" :title="$t('order.AllocationCardNumber')"
-        @cancel="closeModal(showCard, FormDataList)" @before-ok="showCard = false" :okText="$t('form.Confirm')"
-        :cancelText="$t('form.Cancel')" unmount-on-close>
-        <div style="display: flex;justify-content: space-between;">
-            <div>
-                <Upload listType="" minx="1" accept=".xlsx" :handelUpload="customRequest" :showRemoveButton="false"
-                    v-if="showCard">
-                </Upload>
-                <span style="color: #ccc;margin-top: 10px;display: inline-block;">请上传.xlsx文件</span>
-            </div>
-            <div>
-                <a-button type="primary" @click="DownloadSampleFile">下载示例文件</a-button>
-            </div>
-        </div>
-    </a-modal>
-</template>
-
-<script setup>
-import { ref, onMounted, toRefs, toRef, watch } from 'vue';
-import { AcquireOrdertariff, DistributionCard, ReturntheOrderCard, GuideCardProgress } from '@/api/path/order'
-import { Message } from '@arco-design/web-vue';
-import Upload from "@/components/upload/index.vue";
-import { Getdictionary, filterDict } from '@/mixins/index.js'
-import { downloadFile } from '@/utils/xlsx.js'
-import { useI18n } from 'vue-i18n'
-const { t } = useI18n();
-// 定义 props
-const props = defineProps({
-    modelValue: {
-        type: Boolean,
-        default: false
-    },
-    FormDataList: {
-        type: Object,
-        default: () => ({})
-    }
-});
-
-// 将 props 转为 ref
-const modelValue = toRef(props, 'modelValue');
-const FormDataList = toRef(props, 'FormDataList');
-const emit = defineEmits(['update:modelValue', 'submit']);
-
-const state = ref({
-    tariffForm: {},
-    showCard: false,
-    res1: [],
-    res2: [],
-    res3: [],
-    userType: JSON.parse(localStorage.getItem('user_login_information'))?.userType, // 1平台 2用户
-    show: false,
-    schedule: 0, // 进度
-});
-const { tariffForm, showCard, res1, res2, res3, userType, show, schedule } = toRefs(state.value);
-
-// 表格列定义
-const columnsDetail = [
-    { title: 'ICCID', dataIndex: 'iccid' },
-    { title: t('order.CardStatus'), dataIndex: 'status' },
-    { title: t('order.CreationTime'), dataIndex: 'createdAt' }
-];
-
-// 数据详情
-const dataDetail = ref([]);
-
-
-// 分配卡号并处理进度
-const customRequest = async (options) => {
-    const formData = new FormData();
-    formData.append('file', options.fileItem.file); // 文件
-    formData.append('orderId', FormDataList.value.id);
-
-    const res = await DistributionCard(formData);
-    if (res.code === 200) {
-        Message.success(res.message);
-        showCard.value = false;
-        await CardProgress();
-    }
-};
-
-
-// 关闭弹窗
-const cancel = () => emit('update:modelValue', false);
-const closeModal = () => showCard.value = false;
-
-
-// 监听 FormDataList 的变化
-watch(() => FormDataList.value, async (val) => {
-    if (Object.keys(val).length === 0) return;
-    tariffForm.value = val;
-    await fetchOrderCardData(val.id);
-}, { immediate: true });
-
-
-// 下载示例文件
-const DownloadSampleFile = () => downloadFile(['ICCID'], [['8968099000011939']]);
-
-
-
-// 获取和处理订单卡信息
-const fetchOrderCardData = async (orderId) => {
-    const res = await ReturntheOrderCard({ id: orderId });
-    dataDetail.value = res.data?.map(item => ({
-        ...item,
-        status: item.status == 1 ? t('order.normal') : t('order.unsubscribe')
-    })) || [];
-};
-
-
-
-// 获取 ICCID 详情
-const getICCIDDetaile = async () => {
-    const res = await ReturntheOrderCard({ id: tariffForm.value.id });
-    dataDetail.value = res.data?.map(item => ({
-        ...item,
-        status: item.status == 1 ? t('order.normal') : t('order.unsubscribe')
-    })) || [];
-};
-
-
-// 监听导卡进度
-watch(() => modelValue.value, async (val) => {
-    if (val) {
-        await CardProgress();
-    }
-}, { immediate: true });
-
-
-// 卡进度检查
-const CardProgress = async () => {
-    const res = await GuideCardProgress({ id: FormDataList.value.id });
-    if (res.code === 200) {
-        const searchStr = '100.00%';
-        const regex = new RegExp(searchStr);
-        const match = res.data.match(regex);
-        show.value = res.data !== 0 && !match;
-        schedule.value = res.data;
-        if (match) {
-            getICCIDDetaile();
-        }
-    }
-};
-
-
-// 组件挂载时获取字典数据
-onMounted(async () => {
-    const dict = await Getdictionary(['Billingcycle', 'billingMethod', 'currencyType']);
-    res1.value = dict[0];
-    res2.value = dict[1];
-    res3.value = dict[2];
-});
-
-</script>
-<style scoped lang="less">
-.progress {
-    margin: 30px auto;
-    display: flex;
-    justify-content: center;
-
-    .title {
-        text-align: center;
-        font-size: 16px;
-    }
-}
-
-.detail-box {
-    .detail-item-box {
-        display: flex;
-        justify-content: space-between;
-        align-items: center;
-        margin-bottom: 10px;
-
-        .detail-item {
-            //styleName: Body/Medium;
-            font-family: PingFang SC;
-            font-size: 14px;
-            font-weight: 400;
-            line-height: 22px;
-            text-align: left;
-            display: flex;
-            align-items: center;
-            min-width: 350px;
-
-            .item-label {
-                color: rgba(0, 0, 0, 0.4);
-                width: 120px;
-                text-align: right;
-                margin-right: 10px;
-            }
-
-            .item-content {
-                color: rgba(51, 51, 51, 1);
-            }
-        }
-    }
-}
-</style>

+ 0 - 305
src/views/admin/order/BuyCard/index.vue

@@ -1,305 +0,0 @@
-<!-- 购卡订单 -->
-<template>
-  <div class="silent-expire-alarm">
-    <!-- 搜索条件区 -->
-    <div class="search-section">
-      <Search :SearchForm="SearchFormBuyOrder" @query="initData" @reset="reset" />
-    </div>
-    <!-- 数据表格 -->
-    <a-table :data="tableData" :pagination="pageData" :columns="BuyOrdercolumns" @page-change="evChangePage"
-      :scroll="{ x: 'auto' }">
-      <template #image="{ record }">
-        <a-image width="60" height="60" :src="record.contractImg" :preview-props="{
-          actionsLayout: ['rotateRight', 'zoomIn', 'zoomOut'],
-        }" style="cursor: pointer;">
-        </a-image>
-      </template>
-      <template #id="{ record }">
-        <div class="line_heis" @click="openDetail(record)">{{ record.id }}</div>
-      </template>
-      <template #statusType="{ record }">
-        <a-tag color="#ff7d00" v-if="record.moderationStatus == 1">{{ $t('order.TobeReviewed') }}</a-tag>
-        <a-tag color="#00b42a" v-if="record.moderationStatus == 2">{{ $t('order.PassTheExamination') }}</a-tag>
-        <a-tag color="#f53f3f" v-if="record.moderationStatus == 3">{{ $t('order.rejected') }}</a-tag>
-      </template>
-      <template #LogisticsStatus="{ record }">
-        <a-tag color="#168cff" v-if="record.tmsStatus == 1">{{ $t('order.unshipped') }}</a-tag>
-        <a-tag color="#00b42a" v-if="record.tmsStatus == 2">{{ $t('order.shipped') }}</a-tag>
-      </template>
-      <template #operate="{ record }">
-        <div class="setting">
-          <a-button type="text" v-if="record.moderationStatus == 1 && record.status == 1"
-            @click="statusOrder(record)">{{ $t('order.examine') }}</a-button>
-          <a-button @click="uploadModal(record)" type="text">{{ record.contractImg == '' ? $t('order.UploadContract')
-            : $t('order.ViewTheContract')
-            }}</a-button>
-          <a-button @click="openPriceing(record)" type="text" v-if="record.moderationStatus == 2 ">{{
-            $t('order.UploadAmount') }}</a-button>
-          <!-- <a-button @click="openEndDate(record)" type="text" v-if=" record.moderationStatus == 2">{{
-            $t('order.ChangeValidity') }}</a-button> -->
-          <a-button @click="openDetail(record)" type="text">{{ $t('order.view') }}</a-button>
-        </div>
-      </template>
-    </a-table>
-
-
-    <a-modal v-model:visible="uploadContract" width="600px" :title="$t('order.UploadContract')"
-      @cancel="closeModal(uploadContract, formContract)" @ok="handleBeforeOk" :okText="$t('form.Confirm')"
-      :cancelText="$t('form.Cancel')">
-      <a-form :model="formContract" auto-label-width>
-        <a-form-item field="customerName" :label="$t('lotCard.userName')">
-          <div class="audit-txt" style="color:#418035;">{{ FormDataList.userName }}</div>
-        </a-form-item>
-        <a-form-item field="orderNumber" :label="$t('order.OrderNum')">
-          <div class="audit-txt">{{ FormDataList.id }}</div>
-        </a-form-item>
-        <a-form-item field="contractImg" :label="$t('order.SalesContract')">
-          <Upload v-model:model-value="formContract.contractImg" />
-        </a-form-item>
-      </a-form>
-    </a-modal>
-
-    <a-modal v-model:visible="showPrning" :title="$t('order.UploadAmount')" @cancel="closeModal(showPrning, formPreing)"
-      @ok="handelPriceing" :okText="$t('form.Confirm')" :cancelText="$t('form.Cancel')">
-      <a-form :model="formPreing" auto-label-width>
-        <a-form-item :label="$t('order.PurchaseAmount')">
-          <a-input v-model="formPreing.amount"
-            :placeholder="$t('form.datapoolForm.pleaseSelect') + $t('order.PurchaseAmount')" />
-        </a-form-item>
-      </a-form>
-    </a-modal>
-
-    <a-modal v-model:visible="showEndDate" :title="$t('order.ChangeValidity')"
-      @cancel="closeModal(showEndDate, formEndDate)" @ok="handelEndDate" :okText="$t('form.Confirm')"
-      :cancelText="$t('form.Cancel')">
-      <a-form :model="formEndDate" auto-label-width>
-        <a-form-item :label="$t('lotCard.validity')">
-          <a-date-picker v-model="formEndDate.endDate" style="width: 100%;" />
-        </a-form-item>
-      </a-form>
-    </a-modal>
-
-    <Status v-model:modelValue="showStatus" @submit="initData()" :FormDataList="FormDataList" />
-    <Detaile v-model:modelValue="showDetail" @submit="initData()" :FormDataList="FormDataList" />
-  </div>
-</template>
-
-<script setup>
-import { ref, onMounted, toRefs } from 'vue';
-import { Message } from '@arco-design/web-vue';
-import { purchaseOrderList } from '@/api/path/purchase';
-import { tariiffManageDate } from '@/api/path/tariffManagement.api'
-import { UploadOrderCardContract, SettingPricing } from '@/api/path/order'
-import Upload from "@/components/upload/index.vue";
-import Status from './status.vue'
-import Detaile from './detaile.vue'
-import Search from '@/components/Search/index.vue'
-import { useI18n } from 'vue-i18n'
-import { Getdictionary, tableFunction, filterDict } from '@/mixins/index.js'
-const { t } = useI18n();
-import { SearchFormBuyOrder, BuyOrdercolumns } from '../config'
-// 数据层
-const state = ref({
-  userName: localStorage.getItem('user_login_information')?.username,
-  currentIndex: null,
-  FormDataList: {},
-  pageData: {
-    total: 0,
-    size: 10,
-    current: 1,
-  },
-  showStatus: false,
-  formContract: {
-    id: null,
-    contractImg: []
-  }, // 文件上传列表
-  showDetail: false,
-  uploadContract: false,
-  showPrning: false,
-  formPreing: {
-    id: '',
-    amount: ''
-  },
-  showEndDate: false,
-  formEndDate: {
-    id: '',
-    endDate: ''
-  },
-  orderTypeStatus: [],
-  CardType: [],
-  PackagePlanType: []
-});
-
-const {
-  FormDataList,
-  pageData,
-  showStatus,
-  formContract,
-  showDetail,
-  uploadContract,
-  showPrning,
-  formPreing,
-  showEndDate,
-  formEndDate,
-  CardType,
-  orderTypeStatus,
-  PackagePlanType
-} = toRefs(state.value);
-
-const processData = async (data) => {
-
-  return (data.records || []).map((item, key) => {
-    return {
-      ...item,
-      index: key + 1,
-      sourceName: item.source,
-      cardType: filterDict(CardType.value, item.simType),
-      type: filterDict(PackagePlanType.value, item.isRecharge)
-    }
-  })
-}
-
-const { tableData, evChangePage, initData, reset } = tableFunction(pageData.value, purchaseOrderList, processData)
-
-// 订单审核
-const statusOrder = (items) => {
-  FormDataList.value = items
-  showStatus.value = true
-}
-
-// 上传合同
-const uploadModal = (item) => {
-  uploadContract.value = true;
-  FormDataList.value = item
-  formContract.value = {
-    id: item.id,
-    contractImg: item.contractImg
-  }
-};
-// 查看订单详情
-const openDetail = async (item) => {
-  FormDataList.value = item
-  showDetail.value = true;
-}
-// 上传合同
-const handleBeforeOk = () => {
-  new Promise((resolve, reject) => {
-    formContract.value.id = FormDataList.value.id;
-    UploadOrderCardContract(formContract.value).then(res => {
-      resolve(res)
-      Message.success(res.message)
-      initData();
-    }).catch(error => {
-      reject(error)
-    })
-  })
-};
-// 模态框取消
-const closeModal = (items, obj) => {
-  items = false
-  Object.keys(obj).forEach(key => {
-    if (obj.key) {
-      obj[key] = '';
-    }
-  })
-}
-
-const openPriceing = (data) => {
-  showPrning.value = true;
-  formPreing.value.id = data.id
-  formPreing.value.amount = data.amount;
-}
-
-const handelPriceing = async () => {
-  if (formPreing.value.amount == '' || formPreing.value.amount == 0) {
-    return Message.error(t('order.IncorrectInput'))
-  }
-  formPreing.value.amount = Number(formPreing.value.amount)
-  let res = await SettingPricing(formPreing.value)
-  if (res.code === 200) {
-    Message.success(res.message)
-    closeModal(showPrning.value, formPreing.value)
-    initData()
-  }
-}
-
-const openEndDate = (data) => {
-  formEndDate.value.id = data.trafficId
-  formEndDate.value.endDate = data.endDate
-  showEndDate.value = true;
-}
-
-const handelEndDate = async () => {
-  let res = await tariiffManageDate(formEndDate.value)
-  if (res.code === 200) {
-    Message.success(res.message)
-    closeModal(showEndDate.value, formEndDate.value)
-    initData();
-  }
-}
-
-onMounted(async () => {
-  let dict = await Getdictionary(['cardType', 'orderType', 'setMeal'])
-  CardType.value = dict[0]
-  orderTypeStatus.value = dict[1]
-  PackagePlanType.value = dict[2]
-  await initData();
-})
-</script>
-
-<style scoped lang="less">
-.silent-expire-alarm {
-  padding: 20px !important;
-  // background: #fcf;
-}
-
-.setting {
-  display: flex;
-  align-items: center;
-  justify-content: center;
-}
-
-.search-section {
-  margin-bottom: 20px;
-}
-
-.arco-table-th {
-  white-space: nowrap;
-}
-
-.audit-txt {
-  display: flex;
-  flex-wrap: wrap;
-
-  .audit-tag {
-    width: 180px;
-    color: #b2b2b2;
-    margin-right: 20px;
-
-    span {
-      color: #000;
-      margin-left: 20px;
-    }
-  }
-}
-
-.audit-btn {
-  margin-bottom: 10px;
-}
-
-
-
-.detail-table {
-  margin-top: 20px;
-}
-
-.line_heis {
-  color: #FF8839;
-  cursor: pointer;
-  display: inline-block;
-}
-
-.line_heis:hover {
-  color: #168cff;
-}
-</style>

+ 0 - 75
src/views/admin/order/BuyCard/returnCard.vue

@@ -1,75 +0,0 @@
-<template>
-    <a-modal v-model:visible="modelValue" width="800px" :title="$t('order.ReturnTheCard')" @cancel="cancel"
-        @ok="submitStatus" :okText="$t('form.Confirm')" :cancelText="$t('form.Cancel')">
-        <a-space>
-            <a-input :style="{ width: '320px' }" placeholder="请输入ICCID查询" allow-clear v-model="inputValue">
-                <template #suffix>
-                    <icon-search />
-                </template>
-            </a-input>
-            <a-button type="primary" @click="getDetaileICCID(form.trafficId)">搜索</a-button>
-            <a-button>重置</a-button>
-        </a-space>
-        <p></p>
-        <a-table row-key="iccid" :columns="columns" :data="data" :row-selection="rowSelection"
-            v-model:selectedKeys="selectedKeys" />
-    </a-modal>
-</template>
-
-<script setup>
-import { ref, defineProps, toRef, defineEmits, watch } from 'vue';
-import { Message } from '@arco-design/web-vue';
-import { ReturntheCard, TariffOrderCard } from '@/api/path/order'
-import { useI18n } from 'vue-i18n'
-const { t } = useI18n();
-const props = defineProps({
-    modelValue: {
-        type: Boolean,
-        default: false
-    },
-    ReturnData: [Array, Object],
-})
-const modelValue = toRef(props, 'modelValue')
-const emit = defineEmits(['update:modelValue', 'submit'])
-const selectedKeys = ref([])
-const inputValue = ref()
-const form = ref({})
-const columns = [{ title: 'ICCID', dataIndex: 'iccid' }, { title: t('order.CardStatus'), dataIndex: 'iccidStatus' }, { title: t('order.CreationTime'), dataIndex: 'expireTime' }]
-const data = ref()
-const rowSelection = ref({
-    type: 'checkbox',
-    showCheckedAll: true,
-    onlyCurrent: false,
-});
-const cancel = () => {
-    emit('update:modelValue', false)
-    data.value = []
-}
-const submitStatus = async () => {
-    if (selectedKeys.value.length === 0) {
-        Message.warning($t('form.pleaseSelect') + 'ICCID')
-        return
-    }
-    let res = await ReturntheCard({ iccids: selectedKeys.value, id: form.value.id })
-    if (res.code == 200) {
-        emit('update:modelValue', false)
-        emit('submit', true)
-        data.value = []
-        selectedKeys.value = []
-    }
-}
-
-const getDetaileICCID = async (traaid) => {
-    const res = await TariffOrderCard({ id: traaid, iccid: inputValue.value })
-    if (res.code == 200) {
-        data.value = res.data || []
-    }
-}
-watch(() => props.ReturnData, val => {
-    if (val.id) {
-        form.value = val
-        getDetaileICCID(val.trafficId)
-    }
-}, { immediate: true })
-</script>
-<style scoped></style>

+ 0 - 83
src/views/admin/order/BuyCard/status.vue

@@ -1,83 +0,0 @@
-<template>
-    <a-modal v-model:visible="modelValue" width="800px" :title="$t('order.examine')" @cancel="cancel" @ok="submitStatus"
-    :okText="$t('form.Confirm')" :cancelText="$t('form.Cancel')">
-        <a-form :model="formStatus" :style="{ width: '600px' }">
-            <a-form-item :label="$t('lotCard.userName')">
-                {{ FormDataList.userName }}
-            </a-form-item>
-            <a-form-item :label="$t('order.OrderNum')">
-                {{ FormDataList.id }}
-            </a-form-item>
-            <a-form-item label="套餐计划名称">
-                {{ FormDataList.terminalName }}
-            </a-form-item>
-            <a-form-item :label="$t('order.AuditOpinion')">
-                <a-radio-group v-model="formStatus.moderationStatus" :options="optionsStatus">
-                    <template #label="{ data }">
-                        <a-tag>{{ data.label }}</a-tag>
-                    </template>
-                </a-radio-group>
-            </a-form-item>
-            <a-form-item :label="$t('lotCard.remark')">
-                <a-textarea :placeholder="$t('form.datapoolForm.pleaseSelect')+$t('lotCard.remark')" v-model:model-value="formStatus.moderationNotes" allow-clear />
-            </a-form-item>
-        </a-form>
-    </a-modal>
-</template>
-
-<script setup>
-import { ref, onMounted, toRefs, defineProps, toRef, defineEmits } from 'vue';
-import { OrderCardStatus } from '@/api/path/order'
-import { Message } from '@arco-design/web-vue';
-import {useI18n} from 'vue-i18n'
-const {t} = useI18n();
-const props = defineProps({
-    modelValue: {
-        type: Boolean,
-        default: false
-    },
-    FormDataList: {
-        type: Object,
-        default: () => ({})
-    }
-})
-const modelValue = toRef(props, 'modelValue')
-const FormDataList = toRef(props, 'FormDataList')
-const emit = defineEmits(['update:modelValue', 'submit'])
-
-const state = ref({
-    formStatus: {
-        id: null,
-        moderationStatus: '', // 审核状态
-        moderationNotes: '', // 审核备注
-    },
-    optionsStatus: [
-        { label: t('order.PassTheExamination'), value: '2' },
-        { label: t('order.TurnDown'), value: '3' },
-    ],
-})
-
-const { formStatus ,optionsStatus} = toRefs(state.value)
-
-// 订单审核
-const submitStatus = async () => {
-    new Promise((resolve, reject) => {
-        formStatus.value.id = FormDataList.value.id
-        OrderCardStatus(formStatus.value).then(res => {
-            Message.success(res.message)
-            emit('update:modelValue', false)
-            emit('submit', true)
-        }).catch(error => [
-            reject(error)
-        ])
-    })
-}
-
-const cancel = ()=>{
-    emit('update:modelValue', false)
-    Object.keys(formStatus.value).forEach(key => {
-        formStatus.value[key] = ''
-    })
-}
-</script>
-<style scoped></style>

+ 0 - 161
src/views/admin/order/CancelOrder/detaile.vue

@@ -1,161 +0,0 @@
-<template>
-    <a-modal v-model:visible="modelValue" width="800px" title="订单详情" @cancel="cancel" @ok="showDetail = false">
-        <div class="detail-box">
-            <div class="detail-item-box">
-                <div class="detail-item">
-                    <div class="item-label">订单编号</div>
-                    <div class="item-content">{{ FormDataList.id }}</div>
-                </div>
-                <div class="detail-item">
-                    <div class="item-label">订单状态</div>
-                    <div class="item-content">
-                        <a-tag color="#168cff" v-if="FormDataList.tmsStatus == 1">未发货</a-tag>
-                        <a-tag color="#00b42a" v-if="FormDataList.tmsStatus == 2">已发货</a-tag>
-                    </div>
-                </div>
-            </div>
-            <div class="detail-item-box">
-                <div class="detail-item">
-                    <div class="item-label">运营商</div>
-                    <div class="item-content">{{ FormDataList.sourceName }}</div>
-                </div>
-                <div class="detail-item">
-                    <div class="item-label">资费信息</div>
-                    <div class="item-content">{{ TariffInfomr }}</div>
-                </div>
-            </div>
-            <div class="detail-item-box">
-                <div class="detail-item">
-                    <div class="item-label">最短订阅周期</div>
-                    <div class="item-content">{{ tariffForm.settlementCycle?.split('~')[0] }}个月</div>
-                </div>
-                <div class="detail-item">
-                    <div class="item-label">最长订阅周期</div>
-                    <div class="item-content">{{ tariffForm.settlementCycle?.split('~')[1] }}个月</div>
-                </div>
-            </div>
-            <div class="detail-item-box">
-                <div class="detail-item">
-                    <div class="item-label">流量结算方式</div>
-                    <div class="item-content">{{ tariffForm.billingMethodName }}</div>
-                </div>
-                <div class="detail-item">
-                    <div class="item-label">结算周期</div>
-                    <div class="item-content">{{ tariffForm.billingcycleName }}</div>
-                </div>
-            </div>
-            <div class="detail-item-box">
-                <div class="detail-item">
-                    <div class="item-label">卡类型</div>
-                    <div class="item-content">{{ FormDataList.CardType }}</div>
-                </div>
-                <div class="detail-item">
-                    <div class="item-label">标准价格</div>
-                    <div class="item-content">{{ tariffForm.pricingName }}</div>
-                </div>
-            </div>
-            <div class="detail-item-box">
-                <div class="detail-item">
-                    <div class="item-label">流量池</div>
-                    <div class="item-content">{{ FormDataList.isTrafficPool == 1 ? '是' : '否' }}</div>
-                </div>
-            </div>
-            <div class="detail-item-box">
-                <div class="detail-item">
-                    <div class="item-label">卡数量</div>
-                    <div class="item-content">{{ dataDetail.length }}
-                    </div>
-                </div>
-            </div>
-        </div>
-        <div class="detail-table">
-            <a-table :columns="columnsDetail" :data="dataDetail" />
-        </div>
-    </a-modal>
-</template>
-
-<script setup>
-import { ref, onMounted, toRefs, toRef ,watch} from 'vue';
-import { AcquireOrdertariff,TariffOrderCard } from '@/api/path/order'
-import { Getdictionary } from '@/mixins/index.js'
-const props = defineProps({
-    modelValue: {
-        type: Boolean,
-        default: false
-    },
-    FormDataList: {
-        type: Object,
-        default: () => ({})
-    }
-})
-const modelValue = toRef(props, 'modelValue')
-const FormDataList = toRef(props, 'FormDataList')
-const emit = defineEmits(['update:modelValue', 'submit'])
-const state = ref({
-    tariffForm: {},
-    res1:[],
-    res2:[],
-    res3:[],
-})
-const { tariffForm,res1,res2,res3 } = toRefs(state.value)
-const columnsDetail = [{ title: 'ICCID', dataIndex: 'iccid' }
-]
-const dataDetail = ref([])
-
-const cancel = () => {
-    emit('update:modelValue', false)
-}
-
-watch(() => FormDataList.value, val => {
-    if (Object.keys(val).length === 0) return
-    AcquireOrdertariff({ id: val.trafficId }).then(res => {
-        tariffForm.value = res.data
-        tariffForm.value.billingcycleName = res1.value.filter(val => val.value == res.data.billingCycle)[0]?.label;
-        tariffForm.value.billingMethodName = res2.value.filter(val => val.value == res.data.billingMethod)[0]?.label;
-        tariffForm.value.TariffInfomr = res.data.trafficBilling + '/' + res.data.trafficBillingType
-        tariffForm.value.pricingName = tariffForm.value.pricing !== '' ? tariffForm.value.pricing + '/' + res3.value.filter(val => val.value == res.data.currency)[0]?.label : '';
-    })
-    TariffOrderCard({id:val.trafficId}).then(res=>{
-        dataDetail.value = res.data
-    })
-},{deep: true})
-
-onMounted(async () => {
-    res1.value = await Getdictionary('Billingcycle')
-    res2.value = await Getdictionary('billingMethod')
-    res3.value = await Getdictionary('currencyType')
-})
-</script>
-<style scoped lang="less">
-.detail-box {
-    .detail-item-box {
-        display: flex;
-        justify-content: space-between;
-        align-items: center;
-        margin-bottom: 10px;
-
-        .detail-item {
-            //styleName: Body/Medium;
-            font-family: PingFang SC;
-            font-size: 14px;
-            font-weight: 400;
-            line-height: 22px;
-            text-align: left;
-            display: flex;
-            align-items: center;
-            min-width: 350px;
-
-            .item-label {
-                color: rgba(0, 0, 0, 0.4);
-                width: 120px;
-                text-align: right;
-                margin-right: 10px;
-            }
-
-            .item-content {
-                color: rgba(51, 51, 51, 1);
-            }
-        }
-    }
-}
-</style>

+ 0 - 204
src/views/admin/order/CancelOrder/index.vue

@@ -1,204 +0,0 @@
-<!-- 退卡订单 -->
-<template>
-  <div class="silent-expire-alarm">
-    <!-- 搜索条件区 -->
-    <div class="search-section">
-      <Search/>
-    </div>
-    <!-- 数据表格 -->
-    <a-table :columns="columns" :data="tableData" :pagination="pagination" :scroll="{ x: '100%', y: '400px' }">
-      <template #detail="{ record }">
-        <a-button @click="openDetail(record)" type="text">订单详情</a-button>
-      </template>
-      <template #orderStatus="{ record }">
-        <a-tag color="orangered" v-if="record.moderationStatus == 1">待审核</a-tag>
-        <a-tag color="arcoblue" v-if="record.moderationStatus == 2">审核通过</a-tag>
-        <a-tag color="#f53f3f" v-if="record.moderationStatus == 3">已驳回</a-tag>
-      </template>
-      <template #id="{ record }">
-        <div class="line_heis" @click="openDetail(record)">{{ record.id }}</div>
-      </template>
-      <template #operate="{ record }">
-        <a-button type="primary" @click="showAudit = true">审核</a-button>
-      </template>
-    </a-table>
-
-    
-    <Status v-model:modelValue="showAudit" @submit="intData()" />
-    <Detaile v-model:modelValue="showDetail" @submit="intData()" :FormDataList="FormDataList" />
-
-  </div>
-</template>
-
-<script setup>
-import { ref, onMounted, toRefs } from 'vue';
-import Status from './status.vue'
-import Search from '@/components/Search/index.vue'
-const state = ref({
-  tableData: [],
-  pagination: {
-    total: 0,
-    current: 1,
-    size: 10,
-  },
-  showDetail: false,
-  showAudit: false,
-  FormDataList: {}
-})
-
-const { tableData, pagination, showDetail, showAudit, FormDataList } = toRefs(state.value)
-
-const columns = [
-  { title: '序号', dataIndex: 'index', align: 'center', render: ({ rowIndex }) => rowIndex + 1 },
-  {
-    title: '订单编号', slotName: 'id', ellipsis: true,
-    tooltip: true,
-  },
-  {
-    title: '客户名称', dataIndex: 'userName', ellipsis: true,
-    tooltip: true,
-  },
-  { title: '审核状态', slotName: 'orderStatus', ellipsis: true },
-  {
-    title: '供应商名称', dataIndex: 'sourceName', ellipsis: true,
-    tooltip: true,
-  },
-  { title: '卡数量', dataIndex: 'quantity', ellipsis: true },
-  { title: '注销日期', dataIndex: 'period_of_silence', ellipsis: true },
-  { title: '操作', slotName: 'operate', align: 'center', ellipsis: true }
-];
-
-const StepsData = [
-  {
-    title: '创建',
-    status: 'process',
-    description: '2022-01-01 10:00:00',
-  },
-
-]
-
-// 查看订单详情
-const openDetail = (item) => {
-  showDetail.value = true;
-  FormDataList.value = item;
-}
-
-// 列表-------------------------------------
-// 订单列表
-// const intData = async () => {
-//   const param = {
-//     current: pagination.value.current,
-//     size: pagination.value.size,
-//   }
-//   const one = await Getdictionary('source')
-//   const two = await Getdictionary('cardType')
-//   const tree = await Getdictionary('subscriptionRelationshipStatus')
-//   const tive = await Getdictionary('orderAuditStatus')
-//   cancelOrderList(param).then(res => {
-//     tableData.value = (res.data.records || []).map(item => {
-
-//       const sourceName = one.filter((item) => item.typeKey == enum_dict.SOURCE)?.find(val => item.source == val.value)?.label
-//       const cardTypeName = two.filter((item) => item.typeKey == enum_dict.CARD_TYPE)?.find(val => item.card_type == val.value)?.label
-//       const statusName = tree.filter((item) => item.typeKey == enum_dict.SUBSCRIPTION_RELATIONSHIP_STATUS)?.find(val => item.status == val.value)?.label
-//       const moderationStatusName = tive.filter((item) => item.typeKey == enum_dict.ORDER_AUDIT_STATUS)?.find(val => item.moderation_status == val.value)?.label
-
-//       return {
-//         ...item,
-//         moderationStatusName,
-//         statusName,
-//         cardTypeName,
-//         sourceName
-//       }
-//     });
-//     pagination.value.total = res.data.total;
-//   })
-
-// }
-onMounted(() => {
-  // intData();
-})
-</script>
-
-<style scoped lang="less">
-.silent-expire-alarm {
-  padding: 20px !important;
-  // background: #fcf;
-}
-
-.search-section {
-  margin-bottom: 20px;
-}
-
-.arco-table-th {
-  white-space: nowrap;
-}
-
-.audit-txt {
-  display: flex;
-  justify-content: center;
-  align-items: center;
-
-  .audit-tag {
-    margin-left: 20px;
-    background: #63c2c6;
-    color: #fff;
-    font-size: 12px;
-    display: flex;
-    justify-content: center;
-    align-items: center;
-    padding: 0 10px;
-    box-sizing: border-box;
-    border-radius: 50px;
-  }
-}
-
-.audit-btn {
-  margin-bottom: 10px;
-}
-
-.detail-box {
-  .detail-item-box {
-    display: flex;
-    justify-content: space-between;
-    align-items: center;
-    margin-bottom: 10px;
-
-    .detail-item {
-      //styleName: Body/Medium;
-      font-family: PingFang SC;
-      font-size: 14px;
-      font-weight: 400;
-      line-height: 22px;
-      text-align: left;
-      display: flex;
-      align-items: center;
-      min-width: 350px;
-
-      .item-label {
-        color: rgba(0, 0, 0, 0.4);
-        width: 120px;
-        text-align: right;
-        margin-right: 10px;
-      }
-
-      .item-content {
-        color: rgba(51, 51, 51, 1);
-      }
-    }
-  }
-}
-
-.detail-table {
-  margin-top: 20px;
-}
-
-.line_heis {
-  color: #FF8839;
-  cursor: pointer;
-  display: inline-block;
-}
-
-.line_heis:hover {
-  color: #168cff;
-}
-</style>

+ 0 - 81
src/views/admin/order/CancelOrder/status.vue

@@ -1,81 +0,0 @@
-<template>
-    <div class="">
-        <a-modal v-model:visible="modelValue" title="审核" @cancel="cancel" @before-ok="submitAudit" okText="确定审核"
-            cancelText="关闭">
-            <a-form :model="formAudit" auto-label-width>
-                <a-form-item field="customerName" label="客户">
-                    <!-- <a-input v-model="formAudit.customerName" placeholder="请输入客户" /> -->
-                    <div class="audit-txt" style="color:#418035;">演示账号02</div>
-                </a-form-item>
-                <a-form-item field="cardType" label="卡类型">
-                    <!-- <a-input v-model="formAudit.cardType" placeholder="请输入单号" /> -->
-                    <div class="audit-txt">普通卡切卡普通卡MP1,1元/涨
-                        <div class="audit-tag">共1张卡</div>
-                    </div>
-                </a-form-item>
-                <a-form-item field="money" label="资费">
-                    <!-- <a-input v-model="formAudit.money" placeholder="请输入单号" /> -->
-                    <div class="audit-txt">“移动100M月包”
-                        <div class="audit-tag">订购12个月</div>
-                    </div>
-                </a-form-item>
-                <a-form-item field="orderStatus" label="订单状态">
-                    <!-- <a-input v-model="formAudit.orderStatus" placeholder="请输入单号" /> -->
-                    <a-radio-group v-model="formAudit.orderStatus" :options="options" />
-                </a-form-item>
-                <a-form-item field="auditOpinion" label="审核意见">
-                    <!-- <a-input v-model="formAudit.auditOpinion" placeholder="请输入单号" /> -->
-                    <a-textarea placeholder="您填写的审核意见会直接投送给用户,请认真填写!" v-model="formAudit.auditOpinion" allow-clear />
-                </a-form-item>
-                <a-form-item field="fileList" label="销售合同">
-                    <a-upload action="/" :default-file-list="formAudit.fileList" />
-                </a-form-item>
-            </a-form>
-        </a-modal>
-    </div>
-</template>
-
-<script setup>
-import { ref, onMounted, toRefs, toRef, watch } from 'vue';
-const props = defineProps({
-    modelValue: {
-        type: Boolean,
-        default: false
-    },
-    FormDataList: {
-        type: Object,
-        default: () => ({})
-    }
-})
-const modelValue = toRef(props, 'modelValue')
-const FormDataList = toRef(props, 'FormDataList')
-const emit = defineEmits(['update:modelValue', 'submit'])
-
-const state = ref({
-    options: [
-        { label: '发货', value: '1' },
-        { label: '退回', value: '2' },
-    ],
-    formAudit: {
-        customerName: '',
-        cardType: '',
-        money: '',
-        orderStatus: '',
-        auditOpinion: '',
-        fileList: []
-    },
-    
-})
-
-const { options, formAudit } = toRefs(state.value)
-
-const cancel = () => {
-    emit('update:modelValue', false)
-}
-
-// 确认审核
-const submitAudit = () => {
-   emit('submit',true)
-}
-</script>
-<style scoped></style>

+ 0 - 164
src/views/admin/order/ChangeOrder/detaile.vue

@@ -1,164 +0,0 @@
-<template>
-    <a-modal v-model:visible="modelValue" width="800px" :title="$t('order.OrderDetails')" :closable="false">
-        <div class="detail-box">
-            <div class="detail-item-box">
-                <div class="detail-item">
-                    <div class="item-label">{{ $t('order.OrderNum') }}</div>
-                    <div class="item-content">{{ FormDataList.id }}</div>
-                </div>
-                <div class="detail-item">
-                    <div class="item-label">{{ $t('lotCard.orderType') }}</div>
-                    <div class="item-content">
-                        <a-tag color="#168cff" v-if="FormDataList.tmsStatus == 1">{{ $t('order.unshipped') }}</a-tag>
-                        <a-tag color="#00b42a" v-if="FormDataList.tmsStatus == 2">{{ $t('order.shipped') }}</a-tag>
-                    </div>
-                </div>
-            </div>
-            <div class="detail-item-box">
-                <div class="detail-item">
-                    <div class="item-label">{{ $t('lotCard.operator') }}</div>
-                    <div class="item-content">{{ FormDataList.sourceName }}</div>
-                </div>
-                <div class="detail-item">
-                    <div class="item-label">{{ $t('order.TariffName') }}</div>
-                    <div class="item-content">{{ tariffForm.label }}</div>
-                </div>
-            </div>
-            <div class="detail-item-box">
-                <div class="detail-item">
-                    <div class="item-label">{{ $t('order.BillingMode') }}</div>
-                    <div class="item-content">{{ tariffForm.billingMethodName }}</div>
-                </div>
-                <div class="detail-item">
-                    <div class="item-label">{{ $t('order.SettlementCycle') }}</div>
-                    <div class="item-content">{{ tariffForm.billingcycleName }}</div>
-                </div>
-            </div>
-            <div class="detail-item-box">
-                <div class="detail-item">
-                    <div class="item-label">{{ $t('order.CardType') }}</div>
-                    <div class="item-content">{{ FormDataList.cardType }}</div>
-                </div>
-                <div class="detail-item">
-                    <div class="item-label">{{ $t('order.FlowPool') }}</div>
-                    <div class="item-content">{{ FormDataList.isTrafficPool == 1 ? $t('lotCard.Yes') : $t('lotCard.No')
-                        }}</div>
-                </div>
-            </div>
-            <div class="detail-item-box">
-                <div class="detail-item">
-                    <div class="item-label">{{ $t('order.CardNum') }}</div>
-                    <div class="item-content">{{ dataDetail.length }}</div>
-                </div>
-            </div>
-        </div>
-        <div class="detail-table">
-            <a-table :columns="columnsDetail" :data="dataDetail" />
-        </div>
-
-        <template #footer>
-            <a-button @click="cancel">{{ $t('form.Cancel') }}</a-button>
-        </template>
-    </a-modal>
-
-</template>
-
-<script setup>
-import { ref, onMounted, toRefs, toRef, watch } from 'vue';
-import { AcquireOrdertariff, DistributionCard, ReturntheOrderCard, GuideCardProgress } from '@/api/path/order'
-import { Getdictionary } from '@/mixins/index.js'
-import { useI18n } from 'vue-i18n'
-const { t } = useI18n();
-const props = defineProps({
-    modelValue: {
-        type: Boolean,
-        default: false
-    },
-    FormDataList: {
-        type: Object,
-        default: () => ({})
-    }
-})
-const modelValue = toRef(props, 'modelValue')
-const FormDataList = toRef(props, 'FormDataList')
-const emit = defineEmits(['update:modelValue', 'submit'])
-const state = ref({
-    tariffForm: {},
-    res1: [],
-    res2: [],
-    res3: [],
-})
-const { tariffForm,  res1, res2, res3 } = toRefs(state.value)
-const columnsDetail = [{ title: 'ICCID', dataIndex: 'iccid' }, { title: t('order.CardStatus'), dataIndex: 'status' }, { title: t('order.CreationTime'), dataIndex: 'createdAt' }
-]
-const dataDetail = ref([])
-
-const cancel = () => {
-    emit('update:modelValue', false)
-}
-
-const closeModal = () => {
-    showCard.value = false
-}
-
-watch(() => FormDataList.value, val => {
-    if (Object.keys(val).length === 0) return
-    console.log(val);
-    AcquireOrdertariff({ id: val.trafficId }).then(res => {
-        tariffForm.value = res.data
-        tariffForm.value.billingcycleName = res1.value.filter(val => val.value == res.data.billingCycle)[0]?.label;
-        tariffForm.value.billingMethodName = res2.value.filter(val => val.value == res.data.billingMethod)[0]?.label;
-        tariffForm.value.TariffInfomr = res.data.trafficBilling + '/' + res.data.trafficBillingType
-        tariffForm.value.pricingName = tariffForm.value.pricing !== '' ? tariffForm.value.pricing + '/' + res3.value.filter(val => val.value == res.data.currency)[0]?.label : '';
-    })
-    ReturntheOrderCard({ id: val.id }).then(res => {
-        dataDetail.value = (res.data || []).map(res => ({ ...res, status: res.status == 1 ? t('order.normal') : t('order.unsubscribe') }))
-    })
-}, { immediate: true })
-
-
-onMounted(async () => {
-    res1.value = await Getdictionary('Billingcycle')
-    res2.value = await Getdictionary('billingMethod')
-    res3.value = await Getdictionary('currencyType')
-})
-</script>
-<style scoped lang="less">
-.progress {
-    margin: 30px auto;
-    display: flex;
-    justify-content: center;
-}
-
-.detail-box {
-    .detail-item-box {
-        display: flex;
-        justify-content: space-between;
-        align-items: center;
-        margin-bottom: 10px;
-
-        .detail-item {
-            //styleName: Body/Medium;
-            font-family: PingFang SC;
-            font-size: 14px;
-            font-weight: 400;
-            line-height: 22px;
-            text-align: left;
-            display: flex;
-            align-items: center;
-            min-width: 350px;
-
-            .item-label {
-                color: rgba(0, 0, 0, 0.4);
-                width: 120px;
-                text-align: right;
-                margin-right: 10px;
-            }
-
-            .item-content {
-                color: rgba(51, 51, 51, 1);
-            }
-        }
-    }
-}
-</style>

+ 0 - 187
src/views/admin/order/ChangeOrder/index.vue

@@ -1,187 +0,0 @@
-<!-- 购卡订单 -->
-<template>
-  <div class="silent-expire-alarm">
-    <!-- 搜索条件区 -->
-    <div class="search-section">
-      <Search :SearchForm="SearchFormBuyOrder" @query="intData" @reset="reset" />
-    </div>
-    <!-- 数据表格 -->
-    <a-table :data="tableData" :pagination="pageData" :columns="ChangeOrdercolumns" @page-change="evChangePage"
-      :scroll="{ x: 'auto' }">
-      <template #image="{ record }">
-        <a-image width="60" height="60" :src="record.contractImg" :preview-props="{
-          actionsLayout: ['rotateRight', 'zoomIn', 'zoomOut'],
-        }" style="cursor: pointer;">
-        </a-image>
-      </template>
-      <template #id="{ record }">
-        <div class="line_heis" @click="openDetail(record)">{{ record.id }}</div>
-      </template>
-      <template #statusType="{ record }">
-        <a-tag color="#ff7d00" v-if="record.moderationStatus == 1">{{ $t('order.TobeReviewed') }}</a-tag>
-        <a-tag color="#00b42a" v-if="record.moderationStatus == 2">{{ $t('order.PassTheExamination') }}</a-tag>
-        <a-tag color="#f53f3f" v-if="record.moderationStatus == 3">{{ $t('order.rejected') }}</a-tag>
-      </template>
-      <template #LogisticsStatus="{ record }">
-        <a-tag color="#168cff" v-if="record.tmsStatus == 1">{{ $t('order.unshipped') }}</a-tag>
-        <a-tag color="#00b42a" v-if="record.tmsStatus == 2">{{ $t('order.shipped') }}</a-tag>
-      </template>
-      <template #operate="{ record }">
-        <div class="setting">
-          <a-button type="text" v-if="record.moderationStatus == 1 && record.status == 1 "
-            @click="statusOrder(record)">{{ $t('order.examine') }}</a-button>
-          <a-button @click="openDetail(record)" type="text">{{ $t('order.view') }}</a-button>
-        </div>
-      </template>
-    </a-table>
-
-    <Status v-model:modelValue="showStatus" @submit="intData()" :FormDataList="FormDataList" />
-    <Detaile v-model:modelValue="showDetail" @submit="intData()" :FormDataList="FormDataList" />
-  </div>
-</template>
-
-<script setup>
-import { ref, onMounted, toRefs } from 'vue';
-import { purchaseOrderList } from '@/api/path/purchase';
-import { Getdictionary } from '@/mixins/index.js'
-import Status from './status.vue'
-import Detaile from './detaile.vue'
-import Search from '@/components/Search/index.vue'
-import { SearchFormBuyOrder,ChangeOrdercolumns } from '../config'
-// 数据层
-const state = ref({
-  userName: localStorage.getItem('user_login_information')?.username,
-  tableData: [],
-  FormDataList:{},
-  pageData: {
-    total: 0,
-    size: 10,
-    current: 1,
-  },
-  showStatus: false,
-  showDetail: false,
-  SearchForm: {},
-  orderTypeStatus: []
-});
-
-const {
-  tableData,
-  pageData,
-  FormDataList,
-  showStatus,
-  showDetail,
-  SearchForm,
-  orderTypeStatus
-} = toRefs(state.value);
-
-
-
-// 订单列表
-const intData = async (item) => {
-  if (item) {
-    SearchForm.value = item
-  }
-  const param = {
-    current: pageData.value.current,
-    size: pageData.value.size,
-    ...SearchForm.value
-  }
-  let dict = await Getdictionary(['cardType','source','orderType'])
-  orderTypeStatus.value = dict[2]
-  purchaseOrderList(param).then(res => {
-    tableData.value = (res.data.records || []).map((item, key) => {
-      return {
-        ...item,
-        index: key + 1,
-        sourceName:filterDict(dict[0],item.source) ,
-        cardType:filterDict(dict[1],item.simType) 
-      }
-    });
-    pageData.value.total = res.data.total;
-  })
-}
-
-const reset = (item) => {
-  SearchForm.value = item,
-  pageData.value.current = 1,
-  intData()
-}
-// 分页
-const evChangePage = (page) => {
-  pageData.value.current = page
-  intData()
-}
-
-// 订单审核
-const statusOrder = (items) => {
-  FormDataList.value = items
-  showStatus.value = true
-}
-
-// 查看订单详情
-const openDetail = async (item) => {
-  FormDataList.value = item
-  showDetail.value = true;
-}
-
-onMounted(() => {
-  intData();
-})
-</script>
-
-<style scoped lang="less">
-.silent-expire-alarm {
-  padding: 20px !important;
-  // background: #fcf;
-}
-
-.setting {
-  display: flex;
-  align-items: center;
-  justify-content: center;
-}
-
-.search-section {
-  margin-bottom: 20px;
-}
-
-.arco-table-th {
-  white-space: nowrap;
-}
-
-.audit-txt {
-  display: flex;
-  flex-wrap: wrap;
-
-  .audit-tag {
-    width: 180px;
-    color: #b2b2b2;
-    margin-right: 20px;
-
-    span {
-      color: #000;
-      margin-left: 20px;
-    }
-  }
-}
-
-.audit-btn {
-  margin-bottom: 10px;
-}
-
-
-
-.detail-table {
-  margin-top: 20px;
-}
-
-.line_heis {
-  color: #FF8839;
-  cursor: pointer;
-  display: inline-block;
-}
-
-.line_heis:hover {
-  color: #168cff;
-}
-</style>

+ 0 - 83
src/views/admin/order/ChangeOrder/status.vue

@@ -1,83 +0,0 @@
-<template>
-    <a-modal v-model:visible="modelValue" width="800px" :title="$t('order.examine')" @cancel="cancel" @ok="submitStatus"
-    :okText="$t('form.Confirm')" :cancelText="$t('form.Cancel')">
-        <a-form :model="formStatus" :style="{ width: '600px' }">
-            <a-form-item :label="$t('lotCard.userName')">
-                {{ FormDataList.userName }}
-            </a-form-item>
-            <a-form-item :label="$t('order.OrderNum')">
-                {{ FormDataList.id }}
-            </a-form-item>
-            <a-form-item label="资费套餐名称">
-                {{ FormDataList.terminalName }}
-            </a-form-item>
-            <a-form-item :label="$t('order.AuditOpinion')">
-                <a-radio-group v-model="formStatus.moderationStatus" :options="optionsStatus">
-                    <template #label="{ data }">
-                        <a-tag>{{ data.label }}</a-tag>
-                    </template>
-                </a-radio-group>
-            </a-form-item>
-            <a-form-item :label="$t('lotCard.remark')">
-                <a-textarea :placeholder="$t('form.datapoolForm.pleaseSelect')+$t('lotCard.remark')" v-model:model-value="formStatus.moderationNotes" allow-clear />
-            </a-form-item>
-        </a-form>
-    </a-modal>
-</template>
-
-<script setup>
-import { ref, toRefs, defineProps, toRef, defineEmits } from 'vue';
-import { OrderCardStatus } from '@/api/path/order'
-import { Message } from '@arco-design/web-vue';
-import {useI18n} from 'vue-i18n'
-const {t} = useI18n();
-const props = defineProps({
-    modelValue: {
-        type: Boolean,
-        default: false
-    },
-    FormDataList: {
-        type: Object,
-        default: () => ({})
-    }
-})
-const modelValue = toRef(props, 'modelValue')
-const FormDataList = toRef(props, 'FormDataList')
-const emit = defineEmits(['update:modelValue', 'submit'])
-
-const state = ref({
-    formStatus: {
-        id: null,
-        moderationStatus: '', // 审核状态
-        moderationNotes: '', // 审核备注
-    },
-    optionsStatus: [
-        { label: t('order.PassTheExamination'), value: '2' },
-        { label: t('order.TurnDown'), value: '3' },
-    ],
-})
-
-const { formStatus ,optionsStatus} = toRefs(state.value)
-
-// 订单审核
-const submitStatus = async () => {
-    new Promise((resolve, reject) => {
-        formStatus.value.id = FormDataList.value.id
-        OrderCardStatus(formStatus.value).then(res => {
-            Message.success(res.message)
-            emit('update:modelValue', false)
-            emit('submit', true)
-        }).catch(error => [
-            reject(error)
-        ])
-    })
-}
-
-const cancel = ()=>{
-    emit('update:modelValue', false)
-    Object.keys(formStatus.value).forEach(key => {
-        formStatus.value[key] = ''
-    })
-}
-</script>
-<style scoped></style>

+ 0 - 395
src/views/admin/order/PackageRecharge/index.vue

@@ -1,395 +0,0 @@
-<!-- 套餐充值订单 -->
-<template>
-    <div class="silent-expire-alarm">
-        <!-- 搜索条件区 -->
-        <div class="search-section">
-            <a-form :model="searchForm" layout="inline">
-                <a-form-item field="cardNumber" label="订单编号">
-                    <a-input v-model="searchForm.orderNumber" placeholder="请输入订单编号" allow-clear />
-                </a-form-item>
-                <a-form-item field="customerName" label="ICCID">
-                    <a-input v-model="searchForm.customerName" placeholder="请输入ICCID" allow-clear />
-                </a-form-item>
-                <a-form-item>
-                    <a-space>
-                        <a-button type="primary" @click="handleSearch">搜索</a-button>
-                        <a-button @click="resetSearch">重置</a-button>
-                    </a-space>
-                </a-form-item>
-            </a-form>
-        </div>
-        <div class="audit-btn">
-            <a-button @click="openAudit" type="text">
-                <template #icon>
-                    <icon-plus-circle />
-                </template>
-                <template #default>审核</template>
-            </a-button>
-        </div>
-        <!-- 数据表格 -->
-        <a-table row-key="customerName" v-model:selectedKeys="selectedKeys" :row-selection="rowSelection"
-            :columns="columns" :data="tableData" :pagination="pagination" :scroll="{ x: '100%', y: '400px' }">
-            <template #operate="{ record }">
-                <a-button @click="openContract(record)" type="text">上传合同</a-button>
-            </template>
-            <template #detail="{ record }">
-                <a-button @click="openDetail(record)" type="text">订单详情</a-button>
-            </template>
-        </a-table>
-        <a-modal v-model:visible="uploadContract" title="上传合同" @cancel="handleCancel" @before-ok="handleBeforeOk"
-            okText="保存" cancelText="关闭">
-            <a-form :model="formContract" auto-label-width>
-                <a-form-item field="orderNumber" label="单号">
-                    <!-- <a-input v-model="formContract.orderNumber" disabled placeholder="请输入单号" /> -->
-                    <div class="audit-txt">{{ formContract.orderNumber }}</div>
-                </a-form-item>
-                <a-form-item field="customerName" label="客户">
-                    <!-- <a-input v-model="formContract.customerName" disabled placeholder="请输入客户" /> -->
-                    <div class="audit-txt" style="color:#418035;">{{ formContract.customerName }}</div>
-                </a-form-item>
-                <a-form-item field="fileList" label="销售合同">
-                    <a-upload action="/" :default-file-list="formContract.fileList" />
-                </a-form-item>
-            </a-form>
-        </a-modal>
-        <a-modal v-model:visible="showAudit" title="审核" @cancel="showAudit = false" @before-ok="submitAudit"
-            okText="确定审核" cancelText="关闭">
-            <a-form :model="formAudit" auto-label-width>
-                <a-form-item field="customerName" label="客户">
-                    <!-- <a-input v-model="formAudit.customerName" placeholder="请输入客户" /> -->
-                    <div class="audit-txt" style="color:#418035;">演示账号02</div>
-                </a-form-item>
-                <a-form-item field="cardType" label="卡类型">
-                    <!-- <a-input v-model="formAudit.cardType" placeholder="请输入单号" /> -->
-                    <div class="audit-txt">普通卡切卡普通卡MP1,1元/涨<div class="audit-tag">共1张卡</div>
-                    </div>
-                </a-form-item>
-                <a-form-item field="money" label="资费">
-                    <!-- <a-input v-model="formAudit.money" placeholder="请输入单号" /> -->
-                    <div class="audit-txt">“移动100M月包” <div class="audit-tag">订购12个月</div>
-                    </div>
-                </a-form-item>
-                <a-form-item field="orderStatus" label="订单状态">
-                    <!-- <a-input v-model="formAudit.orderStatus" placeholder="请输入单号" /> -->
-                    <a-radio-group v-model="formAudit.orderStatus" :options="options" />
-                </a-form-item>
-                <a-form-item field="auditOpinion" label="审核意见">
-                    <!-- <a-input v-model="formAudit.auditOpinion" placeholder="请输入单号" /> -->
-                    <a-textarea placeholder="您填写的审核意见会直接投送给用户,请认真填写!" v-model="formAudit.auditOpinion" allow-clear />
-                </a-form-item>
-                <a-form-item field="fileList" label="销售合同">
-                    <a-upload action="/" :default-file-list="formAudit.fileList" />
-                </a-form-item>
-            </a-form>
-        </a-modal>
-        <a-modal v-model:visible="showDetail" width="800px" title="订单详情" :hide-cancel="true" @cancel="detailCancel">
-            <div class="detail-box">
-                <div class="detail-item-box">
-                    <div class="detail-item">
-                        <div class="item-label">订单编号</div>
-                        <div class="item-content">53357981207</div>
-                    </div>
-                    <div class="detail-item">
-                        <div class="item-label">订单状态</div>
-                        <div class="item-content">已发货</div>
-                    </div>
-                </div>
-                <div class="detail-item-box">
-                    <div class="detail-item">
-                        <div class="item-label">发货日期</div>
-                        <div class="item-content">2024-10-24 17:46:33</div>
-                    </div>
-                </div>
-                <div class="detail-item-box">
-                    <div class="detail-item">
-                        <div class="item-label">运营商</div>
-                        <div class="item-content">泰国AIS</div>
-                    </div>
-                    <div class="detail-item">
-                        <div class="item-label">资费信息</div>
-                        <div class="item-content">1.0G/月</div>
-                    </div>
-                </div>
-                <div class="detail-item-box">
-                    <div class="detail-item">
-                        <div class="item-label">最短订阅周期</div>
-                        <div class="item-content">3个月</div>
-                    </div>
-                    <div class="detail-item">
-                        <div class="item-label">最长订阅周期</div>
-                        <div class="item-content">--</div>
-                    </div>
-                </div>
-                <div class="detail-item-box">
-                    <div class="detail-item">
-                        <div class="item-label">流量结算方式</div>
-                        <div class="item-content">按单流量消耗计费</div>
-                    </div>
-                    <div class="detail-item">
-                        <div class="item-label">结算周期</div>
-                        <div class="item-content">月</div>
-                    </div>
-                </div>
-                <div class="detail-item-box">
-                    <div class="detail-item">
-                        <div class="item-label">流量资费计费</div>
-                        <div class="item-content">0.8美金/G;MRC:0元;网络接入0元</div>
-                    </div>
-                </div>
-                <div class="detail-item-box">
-                    <div class="detail-item">
-                        <div class="item-label">卡类型</div>
-                        <div class="item-content">工业级PlugIn</div>
-                    </div>
-                    <div class="detail-item">
-                        <div class="item-label">卡板费</div>
-                        <div class="item-content">1美金</div>
-                    </div>
-                </div>
-                <div class="detail-item-box">
-                    <div class="detail-item">
-                        <div class="item-label">流量池</div>
-                        <div class="item-content">组池</div>
-                    </div>
-                    <div class="detail-item">
-                        <div class="item-label">沉默期</div>
-                        <div class="item-content">6个月</div>
-                    </div>
-                </div>
-                <div class="detail-item-box">
-                    <div class="detail-item">
-                        <div class="item-label">卡数量</div>
-                        <div class="item-content">10000;已分配0,已退回0,已转移0
-                            <a-button type="primary" @click="showCard = true" style="margin-left:10px;">分配卡号</a-button>
-                        </div>
-                    </div>
-                </div>
-            </div>
-            <div class="detail-table">
-                <a-table :columns="columnsDetail" :data="dataDetail" />
-            </div>
-        </a-modal>
-        <a-modal v-model:visible="showCard" width="800px" title="分配卡号" @cancel="showCard = false"
-            @before-ok="submitCard" okText="确认" cancelText="取消">
-            <a-textarea :auto-size="{
-                minRows: 15,
-                maxRows: 15
-            }" v-model="cardNumber" max-length="1000" :show-word-limit="true"
-                placeholder="请输入iccid,一行一个或者逗号分隔;不支持两种混合号码。" allow-clear />
-        </a-modal>
-    </div>
-</template>
-
-<script setup>
-import { ref, reactive } from 'vue';
-import { Message } from '@arco-design/web-vue';
-const selectedKeys = ref([]);
-const rowSelection = reactive({
-    type: 'checkbox',
-    showCheckedAll: true,
-    onlyCurrent: false,
-});
-const searchForm = reactive({
-    cardNumber: '',
-    customerName: '',
-});
-
-const columns = [
-    { title: '序号', dataIndex: 'index', align: 'center', render: ({ rowIndex }) => rowIndex + 1 },
-    { title: '订单编号', dataIndex: 'cardNumber' },
-    { title: 'ICCID', dataIndex: 'customerName' },
-    { title: 'MSISDN', dataIndex: 'msisdn' },
-    { title: '订单类型', dataIndex: 'orderStatus' },
-    { title: '运营商名称', dataIndex: 'cardQuantity' },
-    { title: '购买套餐', dataIndex: 'source' },
-    { title: '套餐类型', dataIndex: 'packageStatus' },
-    { title: '订购时长', dataIndex: 'money' },
-    { title: '套餐价格', dataIndex: 'outMoney' },
-    { title: '支付状态', dataIndex: 'payStatus' },
-    { title: '支付价格', dataIndex: 'payMoney' },
-    { title: '支付时间', dataIndex: 'orderTime' },
-    // { title: '操作', slotName: 'operate', align: 'center' },
-    { title: '详情', slotName: 'detail', align: 'center' },
-];
-const columnsDetail = [{ title: 'ICCID', dataIndex: 'iccid' },
-{ title: '池名称及编号', dataIndex: 'nameAndId' },
-{ title: '卡状态', dataIndex: 'status' },
-]
-const dataDetail = ref([{
-    iccid: '8986061800002054589N',
-    nameAndId: '泰国监控40G共享/53357981207',
-    status: '沉默期'
-},
-{
-    iccid: '8986061800002054588N',
-    nameAndId: '泰国监控40G共享/53357981207',
-    status: '沉默期'
-}, {
-    iccid: '8986061800002054587N',
-    nameAndId: '泰国监控40G共享/53357981207',
-    status: '沉默期'
-}, {
-    iccid: '8986061800002054586N',
-    nameAndId: '泰国监控40G共享/53357981207',
-    status: '沉默期'
-},])
-const tableData = ref([]);
-// 上传合同的弹框
-const uploadContract = ref(false);
-const pagination = reactive({
-    total: tableData.value.length,
-    current: 1,
-    pageSize: 10,
-});
-const openContract = (item) => {
-    console.log(item, '???')
-    uploadContract.value = true;
-    formContract.customerName = item.customerName;
-    formContract.orderNumber = item.cardNumber;
-};
-//订单详情的弹框
-const showDetail = ref(false);
-// 查看订单详情
-const openDetail = (item) => {
-    showDetail.value = true;
-}
-const handleBeforeOk = (done) => {
-    console.log(formContract)
-    window.setTimeout(() => {
-        done()
-        // prevent close
-        // done(false)
-    }, 3000)
-};
-const handleCancel = () => {
-    uploadContract.value = false;
-}
-const handleSearch = () => {
-    console.log('Search form data:', searchForm);
-    Message.success('执行搜索操作');
-};
-
-const resetSearch = () => {
-    Object.keys(searchForm).forEach(key => {
-        if (Array.isArray(searchForm[key])) {
-            searchForm[key] = [];
-        } else {
-            searchForm[key] = null;
-        }
-    });
-    Message.success('搜索条件已重置');
-};
-// 文件上传的列表
-const formContract = reactive({
-    orderNumber: '',
-    customerName: '',
-    fileList: []
-})
-// 订单状态
-const options = [
-    { label: '发货', value: '1' },
-    { label: '退回', value: '2' },
-];
-// 审核
-const showAudit = ref(false);
-const formAudit = reactive({
-    customerName: '',
-    cardType: '',
-    money: '',
-    orderStatus: '',
-    auditOpinion: '',
-    fileList: []
-})
-// 触发审核的弹框
-const openAudit = () => {
-    showAudit.value = true;
-}
-// 确认审核
-const submitAudit = () => {
-    console.log(formAudit, 'lll')
-    window.setTimeout(() => {
-        showAudit.value = false;
-    }, 1000)
-}
-// 分配卡号的值
-const cardNumber = ref('');
-const showCard = ref(false);
-const detailCancel = () => {
-}
-const submitCard = () => {
-}
-</script>
-
-<style scoped lang="less">
-.silent-expire-alarm {
-    padding: 20px !important;
-    // background: #fcf;
-}
-
-.search-section {
-    margin-bottom: 20px;
-}
-
-.arco-table-th {
-    white-space: nowrap;
-}
-
-.audit-txt {
-    display: flex;
-    justify-content: center;
-    align-items: center;
-
-    .audit-tag {
-        margin-left: 20px;
-        background: #63c2c6;
-        color: #fff;
-        font-size: 12px;
-        display: flex;
-        justify-content: center;
-        align-items: center;
-        padding: 0 10px;
-        box-sizing: border-box;
-        border-radius: 50px;
-    }
-}
-
-.audit-btn {
-    margin-bottom: 10px;
-}
-
-.detail-box {
-    .detail-item-box {
-        display: flex;
-        justify-content: space-between;
-        align-items: center;
-        margin-bottom: 10px;
-
-        .detail-item {
-            //styleName: Body/Medium;
-            font-family: PingFang SC;
-            font-size: 14px;
-            font-weight: 400;
-            line-height: 22px;
-            text-align: left;
-            display: flex;
-            align-items: center;
-            min-width: 350px;
-
-            .item-label {
-                color: rgba(0, 0, 0, 0.4);
-                width: 120px;
-                text-align: right;
-                margin-right: 10px;
-            }
-
-            .item-content {
-                color: rgba(51, 51, 51, 1);
-            }
-        }
-    }
-}
-
-.detail-table {
-    margin-top: 20px;
-}
-</style>

+ 0 - 161
src/views/admin/order/RenewalOrder/detaile.vue

@@ -1,161 +0,0 @@
-<template>
-    <a-modal v-model:visible="modelValue" width="800px" title="订单详情" @cancel="cancel" @ok="showDetail = false">
-        <div class="detail-box">
-            <div class="detail-item-box">
-                <div class="detail-item">
-                    <div class="item-label">订单编号</div>
-                    <div class="item-content">{{ FormDataList.id }}</div>
-                </div>
-                <div class="detail-item">
-                    <div class="item-label">订单状态</div>
-                    <div class="item-content">
-                        <a-tag color="#168cff" v-if="FormDataList.tmsStatus == 1">未发货</a-tag>
-                        <a-tag color="#00b42a" v-if="FormDataList.tmsStatus == 2">已发货</a-tag>
-                    </div>
-                </div>
-            </div>
-            <div class="detail-item-box">
-                <div class="detail-item">
-                    <div class="item-label">运营商</div>
-                    <div class="item-content">{{ FormDataList.sourceName }}</div>
-                </div>
-                <div class="detail-item">
-                    <div class="item-label">资费信息</div>
-                    <div class="item-content">{{ TariffInfomr }}</div>
-                </div>
-            </div>
-            <div class="detail-item-box">
-                <div class="detail-item">
-                    <div class="item-label">最短订阅周期</div>
-                    <div class="item-content">{{ tariffForm.settlementCycle?.split('~')[0] }}个月</div>
-                </div>
-                <div class="detail-item">
-                    <div class="item-label">最长订阅周期</div>
-                    <div class="item-content">{{ tariffForm.settlementCycle?.split('~')[1] }}个月</div>
-                </div>
-            </div>
-            <div class="detail-item-box">
-                <div class="detail-item">
-                    <div class="item-label">流量结算方式</div>
-                    <div class="item-content">{{ tariffForm.billingMethodName }}</div>
-                </div>
-                <div class="detail-item">
-                    <div class="item-label">结算周期</div>
-                    <div class="item-content">{{ tariffForm.billingcycleName }}</div>
-                </div>
-            </div>
-            <div class="detail-item-box">
-                <div class="detail-item">
-                    <div class="item-label">卡类型</div>
-                    <div class="item-content">{{ FormDataList.CardType }}</div>
-                </div>
-                <div class="detail-item">
-                    <div class="item-label">标准价格</div>
-                    <div class="item-content">{{ tariffForm.pricingName }}</div>
-                </div>
-            </div>
-            <div class="detail-item-box">
-                <div class="detail-item">
-                    <div class="item-label">流量池</div>
-                    <div class="item-content">{{ FormDataList.isTrafficPool == 1 ? '是' : '否' }}</div>
-                </div>
-            </div>
-            <div class="detail-item-box">
-                <div class="detail-item">
-                    <div class="item-label">卡数量</div>
-                    <div class="item-content">{{ dataDetail.length }}
-                    </div>
-                </div>
-            </div>
-        </div>
-        <div class="detail-table">
-            <a-table :columns="columnsDetail" :data="dataDetail" />
-        </div>
-    </a-modal>
-</template>
-
-<script setup>
-import { ref, onMounted, toRefs, toRef ,watch} from 'vue';
-import { AcquireOrdertariff,TariffOrderCard } from '@/api/path/order'
-import { Getdictionary } from '@/mixins/index.js'
-const props = defineProps({
-    modelValue: {
-        type: Boolean,
-        default: false
-    },
-    FormDataList: {
-        type: Object,
-        default: () => ({})
-    }
-})
-const modelValue = toRef(props, 'modelValue')
-const FormDataList = toRef(props, 'FormDataList')
-const emit = defineEmits(['update:modelValue', 'submit'])
-const state = ref({
-    tariffForm: {},
-    res1:[],
-    res2:[],
-    res3:[],
-})
-const { tariffForm,res1,res2,res3 } = toRefs(state.value)
-const columnsDetail = [{ title: 'ICCID', dataIndex: 'iccid' }
-]
-const dataDetail = ref([])
-
-const cancel = () => {
-    emit('update:modelValue', false)
-}
-
-watch(() => FormDataList.value, val => {
-    if (Object.keys(val).length === 0) return
-    AcquireOrdertariff({ id: val.trafficId }).then(res => {
-        tariffForm.value = res.data
-        tariffForm.value.billingcycleName = res1.value.filter(val => val.value == res.data.billingCycle)[0]?.label;
-        tariffForm.value.billingMethodName = res2.value.filter(val => val.value == res.data.billingMethod)[0]?.label;
-        tariffForm.value.TariffInfomr = res.data.trafficBilling + '/' + res.data.trafficBillingType
-        tariffForm.value.pricingName = tariffForm.value.pricing !== '' ? tariffForm.value.pricing + '/' + res3.value.filter(val => val.value == res.data.currency)[0]?.label : '';
-    })
-    TariffOrderCard({id:val.trafficId}).then(res=>{
-        dataDetail.value = res.data
-    })
-},{deep: true})
-
-onMounted(async () => {
-    res1.value = await Getdictionary('Billingcycle')
-    res2.value = await Getdictionary('billingMethod')
-    res3.value = await Getdictionary('currencyType')
-})
-</script>
-<style scoped lang="less">
-.detail-box {
-    .detail-item-box {
-        display: flex;
-        justify-content: space-between;
-        align-items: center;
-        margin-bottom: 10px;
-
-        .detail-item {
-            //styleName: Body/Medium;
-            font-family: PingFang SC;
-            font-size: 14px;
-            font-weight: 400;
-            line-height: 22px;
-            text-align: left;
-            display: flex;
-            align-items: center;
-            min-width: 350px;
-
-            .item-label {
-                color: rgba(0, 0, 0, 0.4);
-                width: 120px;
-                text-align: right;
-                margin-right: 10px;
-            }
-
-            .item-content {
-                color: rgba(51, 51, 51, 1);
-            }
-        }
-    }
-}
-</style>

+ 0 - 196
src/views/admin/order/RenewalOrder/index.vue

@@ -1,196 +0,0 @@
-<!-- 退卡订单 -->
-<template>
-  <div class="silent-expire-alarm">
-    <!-- 搜索条件区 -->
-    <div class="search-section">
-      <Search />
-    </div>
-    <!-- 数据表格 -->
-    <a-table :columns="columns" :data="tableData" :pagination="pagination" :scroll="{ x: 'auto'}" @page-change="onPageChange">
-      <template #detail="{ record }">
-        <a-button @click="openDetail(record)" type="text">订单详情</a-button>
-      </template>
-      <template #id="{ record }">
-        <div class="line_heis" @click="openDetail(record)">{{ record.id }}</div>
-      </template>
-      <template #operate="{ record }">
-        <a-button type="primary" @click="showAudit = true">审核</a-button>
-      </template>
-    </a-table>
-
-
-    <Status v-model:modelValue="showAudit" @submit="intData()" />
-    <Detaile v-model:modelValue="showDetail" @submit="intData()" :FormDataList="FormDataList" />
-  </div>
-</template>
-
-<script setup>
-import { ref, onMounted, toRefs } from 'vue';
-import { RenewalOrderInformation } from '@/api/path/renewalOrder'
-import { Getdictionary } from '@/mixins/index.js'
-import Status from './status.vue'
-import Search from '@/components/Search/index.vue'
-const state = ref({
-  searchForm: {
-    cardNumber: '',
-    customerName: '',
-  },
-  tableData: [],
-  pagination: {
-    total: 0,
-    current: 1,
-    size: 10,
-  },
-  showDetail: false,
-  showAudit: false,
-  FormDataList: {}
-})
-
-const { searchForm, tableData, pagination, showDetail, showAudit, FormDataList } = toRefs(state.value)
-
-const columns = [
-  { title: '序号', dataIndex: 'index', align: 'center', render: ({ rowIndex }) => rowIndex + 1 },
-  {
-    title: '订单编号', dataIndex: 'id', ellipsis: true,
-    tooltip: true,
-    align: 'center',
-  },
-  {
-    title: '客户名称', dataIndex: 'userName', ellipsis: true,
-    tooltip: true,
-    align: 'center',
-  },
-  {
-    title: '供应商名称', dataIndex: 'sourceName', ellipsis: true,
-    tooltip: true, align: 'center',
-  },
-  { title: '资费名称', dataIndex: 'trafficName', ellipsis: true, align: 'center', },
-  { title: '采购数量', dataIndex: 'quantity', ellipsis: true, align: 'center', },
-  { title: '创建时间', dataIndex: 'createdAt', ellipsis: true, align: 'center', },
-  { title: '有效期', dataIndex: 'endDate', ellipsis: true, align: 'center', },
-  { title: '原有效期', dataIndex: 'beforeEndDate', ellipsis: true, align: 'center', },
-  { title: '订单金额', dataIndex: 'payment_amount', ellipsis: true, align: 'center', },
-  // { title: '操作', slotName: 'operate', align: 'center', ellipsis: true, align: 'center', }
-];
-
-// 查看订单详情
-const openDetail = (item) => {
-  showDetail.value = true;
-  FormDataList.value = item;
-}
-
-// 列表-------------------------------------
-// 订单列表
-const intData = async () => {
-  const param = {
-    current: pagination.value.current,
-    size: pagination.value.size,
-  }
-  const one = await Getdictionary('source')
-  const two = await Getdictionary('cardType')
-  RenewalOrderInformation(param).then(res => {
-    tableData.value = (res.data.records || []).map(item => {
-      const sourceName = one.find(val => item.source == val.value)?.label
-      const cardTypeName = two.find(val => item.cardType == val.value)?.label
-      return {
-        ...item,
-        cardTypeName,
-        sourceName
-      }
-    });
-    pagination.value.total = res.data.total;
-  })
-}
-
-const onPageChange = (e)=>{
-  pagination.value.current = e
-  intData();
-}
-onMounted(() => {
-  intData();
-})
-</script>
-
-<style scoped lang="less">
-.silent-expire-alarm {
-  padding: 20px !important;
-  // background: #fcf;
-}
-
-.search-section {
-  margin-bottom: 20px;
-}
-
-.arco-table-th {
-  white-space: nowrap;
-}
-
-.audit-txt {
-  display: flex;
-  justify-content: center;
-  align-items: center;
-
-  .audit-tag {
-    margin-left: 20px;
-    background: #63c2c6;
-    color: #fff;
-    font-size: 12px;
-    display: flex;
-    justify-content: center;
-    align-items: center;
-    padding: 0 10px;
-    box-sizing: border-box;
-    border-radius: 50px;
-  }
-}
-
-.audit-btn {
-  margin-bottom: 10px;
-}
-
-.detail-box {
-  .detail-item-box {
-    display: flex;
-    justify-content: space-between;
-    align-items: center;
-    margin-bottom: 10px;
-
-    .detail-item {
-      //styleName: Body/Medium;
-      font-family: PingFang SC;
-      font-size: 14px;
-      font-weight: 400;
-      line-height: 22px;
-      text-align: left;
-      display: flex;
-      align-items: center;
-      min-width: 350px;
-
-      .item-label {
-        color: rgba(0, 0, 0, 0.4);
-        width: 120px;
-        text-align: right;
-        margin-right: 10px;
-      }
-
-      .item-content {
-        color: rgba(51, 51, 51, 1);
-      }
-    }
-  }
-}
-
-.detail-table {
-  margin-top: 20px;
-}
-
-.line_heis {
-  color: #FF8839;
-  cursor: pointer;
-  display: inline-block;
-}
-
-.line_heis:hover {
-  color: #168cff;
-}
-</style>

+ 0 - 81
src/views/admin/order/RenewalOrder/status.vue

@@ -1,81 +0,0 @@
-<template>
-    <div class="">
-        <a-modal v-model:visible="modelValue" title="审核" @cancel="cancel" @before-ok="submitAudit" okText="确定审核"
-            cancelText="关闭">
-            <a-form :model="formAudit" auto-label-width>
-                <a-form-item field="customerName" label="客户">
-                    <!-- <a-input v-model="formAudit.customerName" placeholder="请输入客户" /> -->
-                    <div class="audit-txt" style="color:#418035;">演示账号02</div>
-                </a-form-item>
-                <a-form-item field="cardType" label="卡类型">
-                    <!-- <a-input v-model="formAudit.cardType" placeholder="请输入单号" /> -->
-                    <div class="audit-txt">普通卡切卡普通卡MP1,1元/涨
-                        <div class="audit-tag">共1张卡</div>
-                    </div>
-                </a-form-item>
-                <a-form-item field="money" label="资费">
-                    <!-- <a-input v-model="formAudit.money" placeholder="请输入单号" /> -->
-                    <div class="audit-txt">“移动100M月包”
-                        <div class="audit-tag">订购12个月</div>
-                    </div>
-                </a-form-item>
-                <a-form-item field="orderStatus" label="订单状态">
-                    <!-- <a-input v-model="formAudit.orderStatus" placeholder="请输入单号" /> -->
-                    <a-radio-group v-model="formAudit.orderStatus" :options="options" />
-                </a-form-item>
-                <a-form-item field="auditOpinion" label="审核意见">
-                    <!-- <a-input v-model="formAudit.auditOpinion" placeholder="请输入单号" /> -->
-                    <a-textarea placeholder="您填写的审核意见会直接投送给用户,请认真填写!" v-model="formAudit.auditOpinion" allow-clear />
-                </a-form-item>
-                <a-form-item field="fileList" label="销售合同">
-                    <a-upload action="/" :default-file-list="formAudit.fileList" />
-                </a-form-item>
-            </a-form>
-        </a-modal>
-    </div>
-</template>
-
-<script setup>
-import { ref, onMounted, toRefs, toRef, watch } from 'vue';
-const props = defineProps({
-    modelValue: {
-        type: Boolean,
-        default: false
-    },
-    FormDataList: {
-        type: Object,
-        default: () => ({})
-    }
-})
-const modelValue = toRef(props, 'modelValue')
-const FormDataList = toRef(props, 'FormDataList')
-const emit = defineEmits(['update:modelValue', 'submit'])
-
-const state = ref({
-    options: [
-        { label: '发货', value: '1' },
-        { label: '退回', value: '2' },
-    ],
-    formAudit: {
-        customerName: '',
-        cardType: '',
-        money: '',
-        orderStatus: '',
-        auditOpinion: '',
-        fileList: []
-    },
-    
-})
-
-const { options, formAudit } = toRefs(state.value)
-
-const cancel = () => {
-    emit('update:modelValue', false)
-}
-
-// 确认审核
-const submitAudit = () => {
-   emit('submit',true)
-}
-</script>
-<style scoped></style>

+ 0 - 167
src/views/admin/order/ReturnCard/detaile.vue

@@ -1,167 +0,0 @@
-<template>
-    <a-modal v-model:visible="modelValue" width="800px" :title="$t('order.OrderDetails')" :closable="false">
-        <div class="detail-box">
-            <div class="detail-item-box">
-                <div class="detail-item">
-                    <div class="item-label">{{ $t('order.OrderNum') }}</div>
-                    <div class="item-content">{{ FormDataList.id }}</div>
-                </div>
-                <div class="detail-item">
-                    <div class="item-label">{{ $t('lotCard.orderType') }}</div>
-                    <div class="item-content">
-                        <a-tag color="#168cff" v-if="FormDataList.tmsStatus == 1">{{ $t('order.unshipped') }}</a-tag>
-                        <a-tag color="#00b42a" v-if="FormDataList.tmsStatus == 2">{{ $t('order.shipped') }}</a-tag>
-                    </div>
-                </div>
-            </div>
-            <div class="detail-item-box">
-                <div class="detail-item">
-                    <div class="item-label">{{ $t('lotCard.operator') }}</div>
-                    <div class="item-content">{{ FormDataList.sourceName }}</div>
-                </div>
-                <div class="detail-item">
-                    <div class="item-label">{{ $t('order.TariffName') }}</div>
-                    <div class="item-content">{{ tariffForm.label }}</div>
-                </div>
-            </div>
-            <div class="detail-item-box">
-                <div class="detail-item">
-                    <div class="item-label">{{ $t('order.BillingMode') }}</div>
-                    <div class="item-content">{{ tariffForm.billingMethodName }}</div>
-                </div>
-                <div class="detail-item">
-                    <div class="item-label">{{ $t('order.SettlementCycle') }}</div>
-                    <div class="item-content">{{ tariffForm.billingcycleName }}</div>
-                </div>
-            </div>
-            <div class="detail-item-box">
-                <div class="detail-item">
-                    <div class="item-label">{{ $t('order.CardType') }}</div>
-                    <div class="item-content">{{ FormDataList.cardType }}</div>
-                </div>
-                <div class="detail-item">
-                    <div class="item-label">{{ $t('order.FlowPool') }}</div>
-                    <div class="item-content">{{ FormDataList.isTrafficPool == 1 ? $t('lotCard.Yes') : $t('lotCard.No')
-                        }}</div>
-                </div>
-            </div>
-            <div class="detail-item-box">
-                <div class="detail-item">
-                    <div class="item-label">{{ $t('order.CardNum') }}</div>
-                    <div class="item-content">{{ dataDetail.length }}</div>
-                </div>
-            </div>
-        </div>
-        <div class="detail-table">
-            <a-table :columns="columnsDetail" :data="dataDetail" />
-        </div>
-
-        <template #footer>
-            <a-button @click="cancel">{{ $t('form.Cancel') }}</a-button>
-        </template>
-    </a-modal>
-
-</template>
-
-<script setup>
-import { ref, onMounted, toRefs, toRef, watch } from 'vue';
-import { AcquireOrdertariff, DistributionCard, ReturntheOrderCard, GuideCardProgress } from '@/api/path/order'
-import { Message } from '@arco-design/web-vue';
-import Upload from "@/components/upload/index.vue";
-import { Getdictionary } from '@/mixins/index.js'
-import { downloadFile } from '@/utils/xlsx.js'
-import { useI18n } from 'vue-i18n'
-const { t } = useI18n();
-const props = defineProps({
-    modelValue: {
-        type: Boolean,
-        default: false
-    },
-    FormDataList: {
-        type: Object,
-        default: () => ({})
-    }
-})
-const modelValue = toRef(props, 'modelValue')
-const FormDataList = toRef(props, 'FormDataList')
-const emit = defineEmits(['update:modelValue', 'submit'])
-const state = ref({
-    tariffForm: {},
-    res1: [],
-    res2: [],
-    res3: [],
-    userType: JSON.parse(localStorage.getItem('user_login_information'))?.userType, // 1平台 2用户
-})
-const { tariffForm,  res1, res2, res3, userType } = toRefs(state.value)
-const columnsDetail = [{ title: 'ICCID', dataIndex: 'iccid' }, { title: t('order.CardStatus'), dataIndex: 'status' }, { title: t('order.CreationTime'), dataIndex: 'createdAt' }
-]
-const dataDetail = ref([])
-
-const cancel = () => {
-    emit('update:modelValue', false)
-}
-
-const closeModal = () => {
-    showCard.value = false
-}
-
-watch(() => FormDataList.value, val => {
-    if (Object.keys(val).length === 0) return
-    AcquireOrdertariff({ id: val.trafficId }).then(res => {
-        tariffForm.value = res.data
-        tariffForm.value.billingcycleName = res1.value.filter(val => val.value == res.data.billingCycle)[0]?.label;
-        tariffForm.value.billingMethodName = res2.value.filter(val => val.value == res.data.billingMethod)[0]?.label;
-        tariffForm.value.TariffInfomr = res.data.trafficBilling + '/' + res.data.trafficBillingType
-        tariffForm.value.pricingName = tariffForm.value.pricing !== '' ? tariffForm.value.pricing + '/' + res3.value.filter(val => val.value == res.data.currency)[0]?.label : '';
-    })
-    ReturntheOrderCard({ id: val.id }).then(res => {
-        dataDetail.value = (res.data || []).map(res => ({ ...res, status: res.status == 1 ? t('order.normal') : t('order.unsubscribe') }))
-    })
-}, { immediate: true })
-
-
-onMounted(async () => {
-    res1.value = await Getdictionary('Billingcycle')
-    res2.value = await Getdictionary('billingMethod')
-    res3.value = await Getdictionary('currencyType')
-})
-</script>
-<style scoped lang="less">
-.progress {
-    margin: 30px auto;
-    display: flex;
-    justify-content: center;
-}
-
-.detail-box {
-    .detail-item-box {
-        display: flex;
-        justify-content: space-between;
-        align-items: center;
-        margin-bottom: 10px;
-
-        .detail-item {
-            //styleName: Body/Medium;
-            font-family: PingFang SC;
-            font-size: 14px;
-            font-weight: 400;
-            line-height: 22px;
-            text-align: left;
-            display: flex;
-            align-items: center;
-            min-width: 350px;
-
-            .item-label {
-                color: rgba(0, 0, 0, 0.4);
-                width: 120px;
-                text-align: right;
-                margin-right: 10px;
-            }
-
-            .item-content {
-                color: rgba(51, 51, 51, 1);
-            }
-        }
-    }
-}
-</style>

+ 0 - 185
src/views/admin/order/ReturnCard/index.vue

@@ -1,185 +0,0 @@
-<template>
-  <div class="silent-expire-alarm">
-    <!-- 搜索条件区 -->
-    <div class="search-section">
-      <Search :SearchForm="SearchFormBuyOrder" @query="intData" @reset="reset" />
-    </div>
-    <!-- 数据表格 -->
-    <a-table :data="tableData" :pagination="pageData" :columns="Returncolumns" @page-change="evChangePage"
-      :scroll="{ x: 'auto' }">
-      <template #image="{ record }">
-        <a-image width="60" height="60" :src="record.contractImg" :preview-props="{
-          actionsLayout: ['rotateRight', 'zoomIn', 'zoomOut'],
-        }">
-        </a-image>
-      </template>
-      <template #id="{ record }">
-        <div class="line_heis" @click="openDetail(record)">{{ record.id }}</div>
-      </template>
-      <template #statusType="{ record }">
-        <a-tag color="#ff7d00" v-if="record.moderationStatus == 1">{{ $t('order.TobeReviewed') }}</a-tag>
-        <a-tag color="#00b42a" v-if="record.moderationStatus == 2">{{ $t('order.PassTheExamination') }}</a-tag>
-        <a-tag color="#f53f3f" v-if="record.moderationStatus == 3">{{ $t('order.rejected') }}</a-tag>
-      </template>
-      <template #LogisticsStatus="{ record }">
-        <a-tag color="#168cff" v-if="record.tmsStatus == 1">{{ $t('order.unshipped') }}</a-tag>
-        <a-tag color="#00b42a" v-if="record.tmsStatus == 2">{{ $t('order.shipped') }}</a-tag>
-      </template>
-      <template #operate="{ record }">
-          <a-button type="text" v-if="record.moderationStatus == 1 && userType == 1" @click="statusOrder(record)">{{
-            $t('order.examine') }}</a-button>
-          <a-button @click="openDetail(record)" type="text">{{ $t('order.view') }}</a-button>
-      </template>
-    </a-table>
-    <Detaile v-model:modelValue="showDetail" @submit="intData()" :FormDataList="FormDataList" />
-    <Status v-model:modelValue="showStatus" @submit="intData()" :FormDataList="FormDataList" />
-  </div>
-</template>
-
-<script setup>
-import { ref, onMounted, toRefs } from 'vue';
-import { Message } from '@arco-design/web-vue';
-import { cancelOrderList } from '@/api/path/purchase';
-import { SettingPricing } from '@/api/path/order'
-import { Getdictionary } from '@/mixins/index.js'
-import Search from '@/components/Search/index.vue'
-import Status from './status.vue'
-import { useI18n } from 'vue-i18n'
-import Detaile from './detaile.vue'
-import {Returncolumns,SearchFormBuyOrder} from '../config'
-const { t } = useI18n();
-// 数据层
-const state = ref({
-  userName: localStorage.getItem('user_login_information')?.username,
-  userType: JSON.parse(localStorage.getItem('user_login_information'))?.userType, // 1平台 2用户
-  tableData: [],
-  FormDataList: {},
-  pageData: {
-    total: 0,
-    size: 10,
-    current: 1,
-  },
-  showStatus: false,
-  showDetail: false
-});
-
-const {
-  userType,
-  tableData,
-  FormDataList,
-  pageData,
-  showStatus,
-  showDetail
-} = toRefs(state.value);
-
-
-
-// 订单列表
-const intData = async () => {
-  const param = {
-    current: pageData.value.current,
-    size: pageData.value.size,
-  }
-  const simTypeList = await Getdictionary('cardType')
-  let sourceList = await Getdictionary('source')
-  cancelOrderList(param).then(res => {
-    tableData.value = (res.data.records || []).map((item, key) => {
-      const sourceName = sourceList.find(val => val.value == item.source)?.label
-      const cardType = simTypeList.find(val => val.value == item.simType)?.label
-      return {
-        ...item,
-        index: key + 1,
-        sourceName,
-        cardType
-      }
-    });
-    pageData.value.total = res.data.total;
-  })
-
-}
-// 分页
-const evChangePage = (page) => {
-  pageData.value.current = page
-  intData()
-}
-
-// 订单审核
-const statusOrder = (items) => {
-  FormDataList.value = items
-  showStatus.value = true
-}
-
-// 查看订单详情
-const openDetail = async (item) => {
-  FormDataList.value = item
-  showDetail.value = true;
-}
-
-const reset = (item) => {
-  SearchForm.value = item,
-  pageData.value.current = 1,
-  intData()
-}
-
-
-onMounted(() => {
-  intData();
-})
-</script>
-
-<style scoped lang="less">
-.silent-expire-alarm {
-  padding: 20px !important;
-  // background: #fcf;
-}
-
-.setting {
-  display: flex;
-  align-items: center;
-  justify-content: center;
-}
-
-.search-section {
-  margin-bottom: 20px;
-}
-
-.arco-table-th {
-  white-space: nowrap;
-}
-
-.audit-txt {
-  display: flex;
-  flex-wrap: wrap;
-
-  .audit-tag {
-    width: 180px;
-    color: #b2b2b2;
-    margin-right: 20px;
-
-    span {
-      color: #000;
-      margin-left: 20px;
-    }
-  }
-}
-
-.audit-btn {
-  margin-bottom: 10px;
-}
-
-
-
-.detail-table {
-  margin-top: 20px;
-}
-
-.line_heis {
-  color: #FF8839;
-  cursor: pointer;
-  display: inline-block;
-}
-
-.line_heis:hover {
-  color: #168cff;
-}
-</style>

+ 0 - 83
src/views/admin/order/ReturnCard/status.vue

@@ -1,83 +0,0 @@
-<template>
-    <a-modal v-model:visible="modelValue" width="800px" :title="$t('order.examine')" @cancel="cancel" @ok="submitStatus"
-    :okText="$t('form.Confirm')" :cancelText="$t('form.Cancel')">
-        <a-form :model="formStatus" :style="{ width: '600px' }">
-            <a-form-item :label="$t('lotCard.userName')">
-                {{ FormDataList.userName }}
-            </a-form-item>
-            <a-form-item :label="$t('order.OrderNum')">
-                {{ FormDataList.id }}
-            </a-form-item>
-            <a-form-item :label="$t('order.TariffName')">
-                {{ FormDataList.trafficName }}
-            </a-form-item>
-            <a-form-item :label="$t('order.AuditOpinion')">
-                <a-radio-group v-model="formStatus.moderationStatus" :options="optionsStatus">
-                    <template #label="{ data }">
-                        <a-tag>{{ data.label }}</a-tag>
-                    </template>
-                </a-radio-group>
-            </a-form-item>
-            <a-form-item :label="$t('lotCard.remark')">
-                <a-textarea :placeholder="$t('form.datapoolForm.pleaseSelect')+$t('lotCard.remark')" v-model:model-value="formStatus.moderationNotes" allow-clear />
-            </a-form-item>
-        </a-form>
-    </a-modal>
-</template>
-
-<script setup>
-import { ref, onMounted, toRefs, defineProps, toRef, defineEmits } from 'vue';
-import { OrderCardStatus } from '@/api/path/order'
-import { Message } from '@arco-design/web-vue';
-import {useI18n} from 'vue-i18n'
-const {t} = useI18n();
-const props = defineProps({
-    modelValue: {
-        type: Boolean,
-        default: false
-    },
-    FormDataList: {
-        type: Object,
-        default: () => ({})
-    }
-})
-const modelValue = toRef(props, 'modelValue')
-const FormDataList = toRef(props, 'FormDataList')
-const emit = defineEmits(['update:modelValue', 'submit'])
-
-const state = ref({
-    formStatus: {
-        id: null,
-        moderationStatus: '', // 审核状态
-        moderationNotes: '', // 审核备注
-    },
-    optionsStatus: [
-        { label: t('order.PassTheExamination'), value: '2' },
-        { label: t('order.TurnDown'), value: '3' },
-    ],
-})
-
-const { formStatus ,optionsStatus} = toRefs(state.value)
-
-// 订单审核
-const submitStatus = async () => {
-    new Promise((resolve, reject) => {
-        formStatus.value.id = FormDataList.value.id
-        OrderCardStatus(formStatus.value).then(res => {
-            Message.success(res.message)
-            emit('update:modelValue', false)
-            emit('submit', true)
-        }).catch(error => [
-            reject(error)
-        ])
-    })
-}
-
-const cancel = ()=>{
-    emit('update:modelValue', false)
-    Object.keys(formStatus.value).forEach(key => {
-        formStatus.value[key] = ''
-    })
-}
-</script>
-<style scoped></style>

+ 0 - 102
src/views/admin/order/SetmealOrder/index.vue

@@ -1,102 +0,0 @@
-<template>
-    <div class="silent-expire-alarm">
-        <!-- 搜索条件区 -->
-        <div class="search-section">
-            <Search :SearchForm="SearchFormBuyOrder" @query="intData" @reset="reset" />
-        </div>
-        <!-- 数据表格 -->
-        <a-table :data="tableData" :pagination="pageData" :columns="SetMealOrder" @page-change="evChangePage"
-            :scroll="{ x: 'auto' }">
-        </a-table>
-    </div>
-</template>
-
-<script setup>
-import { ref, onMounted, toRefs } from 'vue';
-import Search from '@/components/Search/index.vue'
-import { useI18n } from 'vue-i18n'
-import { Returncolumns, SearchFormBuyOrder } from '../config'
-const { t } = useI18n();
-// 数据层
-const state = ref({
-    tableData: [],
-    pageData: {
-        total: 0,
-        size: 10,
-        current: 1,
-    },
-});
-
-const {
-    tableData,
-    pageData,
-} = toRefs(state.value);
-
-const reset = (item) => {
-    SearchForm.value = item,
-        pageData.value.current = 1,
-        intData()
-}
-
-
-onMounted(() => {
-    intData();
-})
-</script>
-
-<style scoped lang="less">
-.silent-expire-alarm {
-    padding: 20px !important;
-    // background: #fcf;
-}
-
-.setting {
-    display: flex;
-    align-items: center;
-    justify-content: center;
-}
-
-.search-section {
-    margin-bottom: 20px;
-}
-
-.arco-table-th {
-    white-space: nowrap;
-}
-
-.audit-txt {
-    display: flex;
-    flex-wrap: wrap;
-
-    .audit-tag {
-        width: 180px;
-        color: #b2b2b2;
-        margin-right: 20px;
-
-        span {
-            color: #000;
-            margin-left: 20px;
-        }
-    }
-}
-
-.audit-btn {
-    margin-bottom: 10px;
-}
-
-
-
-.detail-table {
-    margin-top: 20px;
-}
-
-.line_heis {
-    color: #FF8839;
-    cursor: pointer;
-    display: inline-block;
-}
-
-.line_heis:hover {
-    color: #168cff;
-}
-</style>

+ 0 - 102
src/views/admin/order/WithdrawalManagement/index.vue

@@ -1,102 +0,0 @@
-<template>
-    <div class="silent-expire-alarm">
-        <!-- 搜索条件区 -->
-        <div class="search-section">
-            <Search :SearchForm="SearchFormWithdrawalManagement" @query="intData" @reset="reset" />
-        </div>
-        <!-- 数据表格 -->
-        <a-table :data="tableData" :pagination="pageData" :columns="WithdrawalManagement" @page-change="evChangePage"
-            :scroll="{ x: 'auto' }">
-        </a-table>
-    </div>
-</template>
-
-<script setup>
-import { ref, onMounted, toRefs } from 'vue';
-import Search from '@/components/Search/index.vue'
-import { useI18n } from 'vue-i18n'
-import { WithdrawalManagement, SearchFormWithdrawalManagement } from '../config'
-const { t } = useI18n();
-// 数据层
-const state = ref({
-    tableData: [],
-    pageData: {
-        total: 0,
-        size: 10,
-        current: 1,
-    },
-});
-
-const {
-    tableData,
-    pageData,
-} = toRefs(state.value);
-
-const reset = (item) => {
-    SearchForm.value = item,
-        pageData.value.current = 1,
-        intData()
-}
-
-
-onMounted(() => {
-    intData();
-})
-</script>
-
-<style scoped lang="less">
-.silent-expire-alarm {
-    padding: 20px !important;
-    // background: #fcf;
-}
-
-.setting {
-    display: flex;
-    align-items: center;
-    justify-content: center;
-}
-
-.search-section {
-    margin-bottom: 20px;
-}
-
-.arco-table-th {
-    white-space: nowrap;
-}
-
-.audit-txt {
-    display: flex;
-    flex-wrap: wrap;
-
-    .audit-tag {
-        width: 180px;
-        color: #b2b2b2;
-        margin-right: 20px;
-
-        span {
-            color: #000;
-            margin-left: 20px;
-        }
-    }
-}
-
-.audit-btn {
-    margin-bottom: 10px;
-}
-
-
-
-.detail-table {
-    margin-top: 20px;
-}
-
-.line_heis {
-    color: #FF8839;
-    cursor: pointer;
-    display: inline-block;
-}
-
-.line_heis:hover {
-    color: #168cff;
-}
-</style>

+ 0 - 202
src/views/admin/order/config.js

@@ -1,202 +0,0 @@
-export const SearchFormBuyOrder = [
-  {
-    type: "input",
-    label: "订单编号",
-    field: "id",
-    value: "", // 双向绑定的值
-  },
-  {
-    type: "select",
-    label: "审核状态",
-    field: "moderationStatus",
-    options: [], // 默认空,后面会通过字典加载
-    dict: "orderType",
-    value: "", // 双向绑定的值
-    width: "200",
-  },
-  {
-    type: "input",
-    label: "客户名称",
-    field: "userName",
-    value: "", // 双向绑定的值
-  },
-  {
-    type: "select",
-    label: "沉默期",
-    field: "periodOfSilence",
-    options: [], // 默认空,后面会通过字典加载
-    dict: "silenceOf",
-    value: "", // 双向绑定的值
-    width: "200",
-  },
-  {
-    type: "select",
-    label: "卡类型",
-    field: "simType",
-    options: [], // 默认空,后面会通过字典加载
-    dict: "cardType",
-    value: "", // 双向绑定的值
-    width: "200",
-  },
-  {
-    type: "select",
-    label: "运营商名称",
-    field: "source",
-    options: [], // 默认空,后面会通过字典加载
-    dict: "source",
-    value: "", // 双向绑定的值
-    width: "200",
-  },
-  {
-    type: "date-picker",
-    label: "下单时间",
-    field: "createdAt",
-    value: "", // 双向绑定的值
-    width: "200",
-  },
-  {
-    type: "date-picker",
-    label: "有效期",
-    field: "endData",
-    value: "", // 双向绑定的值
-    width: "200",
-  },
-];
-
-// 购卡订单
-export const BuyOrdercolumns = [
-  { title: window.$t('order.SerialNumber'), dataIndex: 'index', align: 'center', ellipsis: true },
-  { title: window.$t('order.OrderNum'), slotName: 'id', align: 'center', ellipsis: true },
-  { title: window.$t('order.AuditStatus'), slotName: 'statusType', align: 'center', ellipsis: true },
-  { title: window.$t('order.LogisticsStatus'), slotName: 'LogisticsStatus', align: 'center', ellipsis: true },
-  { title: window.$t('lotCard.userName'), dataIndex: 'userName', align: 'center', ellipsis: true },
-  { title: window.$t('order.NumberCardsPurchased'), dataIndex: 'quantity', align: 'center', ellipsis: true },
-  { title: window.$t('order.SilentPeriod') + (window.$t('lotCard.month')), dataIndex: 'periodOfSilence', align: 'center', ellipsis: true },
-  { title: window.$t('order.CardType'), dataIndex: 'cardType', align: 'center', ellipsis: true },
-  { title: window.$t('order.CarrierName'), dataIndex: 'sourceName', align: 'center', ellipsis: true },
-  { title: '套餐计划名称', dataIndex: 'terminalName', align: 'center', ellipsis: true },
-  { title: '套餐计划类型', dataIndex: 'type', align: 'center', ellipsis: true },
-  { title: window.$t('order.PurchaseAmount'), dataIndex: 'amount', align: 'center', ellipsis: true },
-  { title: window.$t('order.ContractPhoto'), slotName: 'image', align: 'center', ellipsis: true },
-  { title: window.$t('order.OrderTime'), dataIndex: 'createdAt', align: 'center', ellipsis: true },
-  { title: window.$t('lotCard.validity'), dataIndex: 'endDate', align: 'center', ellipsis: true },
-  { title: '备注', dataIndex: 'moderationNotes', align: 'center', ellipsis: true },
-  { title: window.$t('lotCard.Controls'), slotName: 'operate', align: 'center', ellipsis: true, fixed: 'right', },
-];
-
-// 退卡订单
-export const Returncolumns = [
-  { title: window.$t('order.SerialNumber'), dataIndex: 'index', align: 'center', ellipsis: true },
-  { title: window.$t('order.OrderNum'), slotName: 'id', align: 'center', ellipsis: true },
-  { title: window.$t('order.AuditStatus'), slotName: 'statusType', align: 'center', ellipsis: true },
-  { title: window.$t('order.LogisticsStatus'), slotName: 'LogisticsStatus', align: 'center', ellipsis: true },
-  { title: window.$t('lotCard.userName'), dataIndex: 'userName', align: 'center', ellipsis: true },
-  { title: window.$t('order.NumberCardsPurchased'), dataIndex: 'quantity', align: 'center', ellipsis: true },
-  { title: window.$t('order.SilentPeriod') + (window.$t('lotCard.month')), dataIndex: 'periodOfSilence', align: 'center', ellipsis: true },
-  { title: window.$t('order.CardType'), dataIndex: 'cardType', align: 'center', ellipsis: true },
-  { title: window.$t('order.CarrierName'), dataIndex: 'sourceName', align: 'center', ellipsis: true },
-  { title: window.$t('order.tariff'), dataIndex: 'trafficName', align: 'center', ellipsis: true },
-  { title: window.$t('order.PurchaseAmount'), dataIndex: 'amount', align: 'center', ellipsis: true },
-  { title: window.$t('order.ContractPhoto'), slotName: 'image', align: 'center', ellipsis: true },
-  { title: window.$t('order.OrderTime'), dataIndex: 'createdAt', align: 'center', ellipsis: true },
-  { title: window.$t('lotCard.validity'), dataIndex: 'endDate', align: 'center', ellipsis: true },
-  { title: '备注', dataIndex: 'moderationNotes', align: 'center', ellipsis: true },
-  { title: window.$t('lotCard.Controls'), slotName: 'operate', align: 'center', ellipsis: true, fixed: 'right', }
-];
-
-// 变更订单
-export const ChangeOrdercolumns = [
-  { title: window.$t('order.SerialNumber'), dataIndex: 'index', align: 'center', ellipsis: true },
-  { title: window.$t('order.OrderNum'), slotName: 'id', align: 'center', ellipsis: true },
-  { title: window.$t('order.AuditStatus'), slotName: 'statusType', align: 'center', ellipsis: true },
-  { title: window.$t('order.LogisticsStatus'), slotName: 'LogisticsStatus', align: 'center', ellipsis: true },
-  { title: window.$t('lotCard.userName'), dataIndex: 'userName', align: 'center', ellipsis: true },
-  { title: window.$t('order.NumberCardsPurchased'), dataIndex: 'quantity', align: 'center', ellipsis: true },
-  { title: window.$t('order.SilentPeriod') + (window.$t('lotCard.month')), dataIndex: 'periodOfSilence', align: 'center', ellipsis: true },
-  { title: window.$t('order.CardType'), dataIndex: 'cardType', align: 'center', ellipsis: true },
-  { title: window.$t('order.CarrierName'), dataIndex: 'sourceName', align: 'center', ellipsis: true },
-  { title: window.$t('order.tariff'), dataIndex: 'trafficName', align: 'center', ellipsis: true },
-  { title: window.$t('order.PurchaseAmount'), dataIndex: 'amount', align: 'center', ellipsis: true },
-  { title: window.$t('order.ContractPhoto'), slotName: 'image', align: 'center', ellipsis: true },
-  { title: window.$t('order.OrderTime'), dataIndex: 'createdAt', align: 'center', ellipsis: true },
-  { title: window.$t('lotCard.validity'), dataIndex: 'endDate', align: 'center', ellipsis: true },
-  { title: '备注', dataIndex: 'moderationNotes', align: 'center', ellipsis: true },
-  { title: window.$t('lotCard.Controls'), slotName: 'operate', align: 'center', ellipsis: true, fixed: 'right', },
-];
-
-
-// 提现管理
-export const SearchFormWithdrawalManagement = [
-  {
-    type: "input",
-    label: "订单编号",
-    field: "id",
-    value: "", // 双向绑定的值
-  },
-  {
-    type: "select",
-    label: "提现币种",
-    field: "moderationStatus",
-    options: [], // 默认空,后面会通过字典加载
-    dict: "currencyType",
-    value: "", // 双向绑定的值
-    width: "200",
-  },
-  {
-    type: "select",
-    label: "提现状态",
-    field: "moderationStatus",
-    options: [], // 默认空,后面会通过字典加载
-    dict: "",
-    value: "", // 双向绑定的值
-    width: "200",
-  },
-  {
-    type: "select",
-    label: "转账方式",
-    field: "periodOfSilence",
-    options: [], // 默认空,后面会通过字典加载
-    dict: "",
-    value: "", // 双向绑定的值
-    width: "200",
-  },
-  {
-    type: "date-picker",
-    label: "申请时间",
-    field: "createdAt",
-    value: "", // 双向绑定的值
-    width: "200",
-  },
-  {
-    type: "date-picker",
-    label: "审核时间",
-    field: "createdAt",
-    value: "", // 双向绑定的值
-    width: "200",
-  },
-  {
-    type: "date-picker",
-    label: "结算时间",
-    field: "endData",
-    value: "", // 双向绑定的值
-    width: "200",
-  },
-]
-
-
-export const WithdrawalManagement = [
-  { title: '流水ID', dataIndex: 'index', align: 'center', ellipsis: true },
-  { title: '提现币种', slotName: 'id', align: 'center', ellipsis: true },
-  { title: '申请提现金额', slotName: 'statusType', align: 'center', ellipsis: true },
-  { title: '提现手续费', slotName: 'LogisticsStatus', align: 'center', ellipsis: true },
-  { title: '提现实收金额', dataIndex: 'userName', align: 'center', ellipsis: true },
-  { title: '汇率', dataIndex: 'quantity', align: 'center', ellipsis: true },
-  { title: '实付金额', dataIndex: 'periodOfSilence', align: 'center', ellipsis: true },
-  { title: '实付手续费', dataIndex: 'cardType', align: 'center', ellipsis: true },
-  { title: '实付金额', dataIndex: 'sourceName', align: 'center', ellipsis: true },
-  { title: '提现状态', dataIndex: 'trafficName', align: 'center', ellipsis: true },
-  { title: '申请时间', dataIndex: 'amount', align: 'center', ellipsis: true },
-  { title: '审核时间', slotName: 'image', align: 'center', ellipsis: true },
-  { title: '转账方式', dataIndex: 'createdAt', align: 'center', ellipsis: true },
-  { title: '结算时间', dataIndex: 'endDate', align: 'center', ellipsis: true },
-]

+ 0 - 235
src/views/admin/supplier/NewSupplierForm.vue

@@ -1,235 +0,0 @@
-<template>
-    <a-modal :visible="visible" :title="editMode ? $t('supplier.editSupplier') : $t('supplier.addSupplier')"
-        @ok="handleSubmit" @cancel="handleCancel" :mask-closable="false" :width="800">
-        <a-tabs v-model:activeKey="activeTab">
-            <a-tab-pane key="1" :title="$t('supplier.basicInfo')">
-                <a-form :model="formData" :rules="rules" ref="formRef">
-                    <a-form-item field="supplierName" :label="$t('supplier.supplierName')" required>
-                        <a-input v-model="formData.supplierName" :placeholder="$t('supplier.enterSupplierName')" />
-                    </a-form-item>
-                    <a-form-item field="operatorType" :label="$t('supplier.operatorType')" required>
-                        <a-radio-group v-model="formData.operatorType">
-                            <a-radio value="chinamobile">{{ $t('supplier.operatorTypes.chinamobile') }}</a-radio>
-                            <a-radio value="chinaunicom">{{ $t('supplier.operatorTypes.chinaunicom') }}</a-radio>
-                            <a-radio value="chinatelecom">{{ $t('supplier.operatorTypes.chinatelecom') }}</a-radio>
-                            <a-radio value="international">{{ $t('supplier.operatorTypes.international') }}</a-radio>
-                            <a-radio value="foreign_local">{{ $t('supplier.operatorTypes.foreign_local') }}</a-radio>
-                        </a-radio-group>
-                    </a-form-item>
-                </a-form>
-            </a-tab-pane>
-
-            <a-tab-pane key="2" :title="$t('supplier.operatorApiConfig')">
-                <a-form :model="formData.apiConfig" :rules="apiConfigRules" ref="apiConfigFormRef">
-                    <a-form-item field="apiTemplate" :label="$t('supplier.apiTemplate')" required>
-                        <a-select v-model="formData.apiConfig.apiTemplate"
-                            :placeholder="$t('supplier.selectApiTemplate')">
-                            <a-option value="telecom_CMP">{{ $t('supplier.apiTemplates.telecom_CMP') }}</a-option>
-                            <!-- 添加其他API模板选项 -->
-                        </a-select>
-                    </a-form-item>
-                    <a-form-item field="apiUrl" :label="$t('supplier.apiUrl')" required>
-                        <a-input v-model="formData.apiConfig.apiUrl" :placeholder="$t('supplier.enterApiUrl')" />
-                    </a-form-item>
-                    <a-form-item field="realNameAuthUrl" :label="$t('supplier.realNameAuthUrl')">
-                        <a-input v-model="formData.apiConfig.realNameAuthUrl"
-                            :placeholder="$t('supplier.enterRealNameAuthUrl')" />
-                    </a-form-item>
-                    <a-form-item field="realNameUrlParam" :label="$t('supplier.realNameUrlParam')">
-                        <a-input v-model="formData.apiConfig.realNameUrlParam"
-                            :placeholder="$t('supplier.enterRealNameUrlParam')" />
-                    </a-form-item>
-                    <a-form-item field="appKey" :label="$t('supplier.appKey')" required>
-                        <a-input v-model="formData.apiConfig.appKey" :placeholder="$t('supplier.enterAppKey')" />
-                    </a-form-item>
-                    <a-form-item field="apiSecret" :label="$t('supplier.apiSecret')" required>
-                        <a-input v-model="formData.apiConfig.apiSecret" :placeholder="$t('supplier.enterApiSecret')" />
-                    </a-form-item>
-                    <a-form-item field="key" :label="$t('supplier.key')">
-                        <a-input v-model="formData.apiConfig.key" :placeholder="$t('supplier.enterKey')" />
-                    </a-form-item>
-                    <a-form-item field="stopCardAction" :label="$t('supplier.stopCardAction')">
-                        <a-select v-model="formData.apiConfig.stopCardAction"
-                            :placeholder="$t('supplier.selectStopCardAction')">
-                            <a-option value="suspend">{{ $t('supplier.stopCardActions.suspend') }}</a-option>
-                            <!-- 添加其他停卡动作选项 -->
-                        </a-select>
-                    </a-form-item>
-                </a-form>
-            </a-tab-pane>
-
-            <a-tab-pane key="3" :title="$t('supplier.advancedConfig')">
-                <a-form :model="formData.advancedConfig" :rules="advancedConfigRules" ref="advancedConfigFormRef">
-                    <a-form-item field="needManualRealName" :label="$t('supplier.needManualRealName')" required>
-                        <a-radio-group type="button" v-model="formData.advancedConfig.needManualRealName">
-                            <a-radio value="需要">{{ $t('supplier.need') }}</a-radio>
-                            <a-radio value="无需">{{ $t('supplier.noNeed') }}</a-radio>
-                        </a-radio-group>
-                    </a-form-item>
-                    <a-form-item field="autoSyncUsage" :label="$t('supplier.autoSyncUsage')" required>
-                        <a-radio-group type="button" v-model="formData.advancedConfig.autoSyncUsage">
-                            <a-radio value="启用">{{ $t('supplier.enable') }}</a-radio>
-                            <a-radio value="停用">{{ $t('supplier.disable') }}</a-radio>
-                        </a-radio-group>
-                    </a-form-item>
-                    <a-form-item field="useOperatorApi" :label="$t('supplier.useOperatorApi')" required>
-                        <a-radio-group type="button" v-model="formData.advancedConfig.useOperatorApi">
-                            <a-radio value="调用">{{ $t('supplier.call') }}</a-radio>
-                            <a-radio value="不调用">{{ $t('supplier.noCall') }}</a-radio>
-                        </a-radio-group>
-                    </a-form-item>
-                    <a-form-item field="setQuantityLimit" :label="$t('supplier.setQuantityLimit')">
-                        <a-radio-group type="button" v-model="formData.advancedConfig.setQuantityLimit">
-                            <a-radio value="达量断网">{{ $t('supplier.quantityLimit') }}</a-radio>
-                            <a-radio value="不达量断网">{{ $t('supplier.noQuantityLimit') }}</a-radio>
-                        </a-radio-group>
-                    </a-form-item>
-                    <a-form-item field="useOperatorDataPool" :label="$t('supplier.useOperatorDataPool')" required>
-                        <a-radio-group type="button" v-model="formData.advancedConfig.useOperatorDataPool">
-                            <a-radio value="启用">{{ $t('supplier.enable') }}</a-radio>
-                            <a-radio value="不启用">{{ $t('supplier.disable') }}</a-radio>
-                        </a-radio-group>
-                    </a-form-item>
-                    <a-form-item field="silentPeriod" :label="$t('supplier.silentPeriod')" required>
-                        <a-input-number v-model="formData.advancedConfig.silentPeriod"
-                            :placeholder="$t('supplier.enterSilentPeriod')" />
-                    </a-form-item>
-                    <a-form-item field="unusedSuspensionDays" :label="$t('supplier.unusedSuspensionDays')">
-                        <a-input-number v-model="formData.advancedConfig.unusedSuspensionDays"
-                            :placeholder="$t('supplier.enterDays')" />
-                    </a-form-item>
-                    <a-form-item field="maxWhitelistAdditions" :label="$t('supplier.maxWhitelistAdditions')">
-                        <a-input-number v-model="formData.advancedConfig.maxWhitelistAdditions"
-                            :placeholder="$t('supplier.enterTimes')" />
-                    </a-form-item>
-                    <a-form-item field="totalActiveWhitelists" :label="$t('supplier.totalActiveWhitelists')">
-                        <a-input-number v-model="formData.advancedConfig.totalActiveWhitelists"
-                            :placeholder="$t('supplier.enterCount')" />
-                    </a-form-item>
-                    <a-form-item field="dailyWhitelistRemovals" :label="$t('supplier.dailyWhitelistRemovals')">
-                        <a-input-number v-model="formData.advancedConfig.dailyWhitelistRemovals"
-                            :placeholder="$t('supplier.enterCount')" />
-                    </a-form-item>
-                    <a-form-item field="whitelistAddOrder" :label="$t('supplier.whitelistAddOrder')">
-                        <a-select v-model="formData.advancedConfig.whitelistAddOrder"
-                            :placeholder="$t('supplier.selectOrder')">
-                            <a-option value="noWhitelist">{{ $t('supplier.noWhitelist') }}</a-option>
-                            <!-- 添加其他选项 -->
-                        </a-select>
-                    </a-form-item>
-                    <a-form-item field="numberGenerationRule" :label="$t('supplier.numberGenerationRule')">
-                        <a-input v-model="formData.advancedConfig.numberGenerationRule"
-                            :placeholder="$t('supplier.enterNumberGenerationRule')" />
-                    </a-form-item>
-                </a-form>
-            </a-tab-pane>
-        </a-tabs>
-    </a-modal>
-</template>
-
-<script setup>
-import { ref, reactive, watch } from 'vue';
-import { Message } from '@arco-design/web-vue';
-import { useI18n } from 'vue-i18n';
-
-const { t } = useI18n();
-
-const props = defineProps({
-    visible: Boolean,
-    editMode: Boolean,
-    editData: Object,
-});
-
-const emit = defineEmits(['update:visible', 'submit']);
-
-const activeTab = ref('1');
-const formRef = ref(null);
-const apiConfigFormRef = ref(null);
-const advancedConfigFormRef = ref(null);
-
-const formData = reactive({
-    supplierName: '',
-    operatorType: '',
-    apiConfig: {
-        apiTemplate: '',
-        apiUrl: '',
-        realNameAuthUrl: '',
-        realNameUrlParam: '',
-        appKey: '',
-        apiSecret: '',
-        key: '',
-        stopCardAction: '',
-    },
-    advancedConfig: {
-        needManualRealName: '',
-        autoSyncUsage: '',
-        useOperatorApi: '',
-        setQuantityLimit: '',
-        useOperatorDataPool: '',
-        silentPeriod: null,
-        unusedSuspensionDays: null,
-        maxWhitelistAdditions: null,
-        totalActiveWhitelists: null,
-        dailyWhitelistRemovals: null,
-        whitelistAddOrder: '',
-        numberGenerationRule: '',
-    },
-});
-
-const rules = {
-    supplierName: [{ required: true, message: t('supplier.supplierNameRequired') }],
-    operatorType: [{ required: true, message: t('supplier.operatorTypeRequired') }],
-};
-
-const apiConfigRules = {
-    apiTemplate: [{ required: true, message: t('supplier.apiTemplateRequired') }],
-    apiUrl: [{ required: true, message: t('supplier.apiUrlRequired') }],
-    appKey: [{ required: true, message: t('supplier.appKeyRequired') }],
-    apiSecret: [{ required: true, message: t('supplier.apiSecretRequired') }],
-};
-
-const advancedConfigRules = {
-    needManualRealName: [{ required: true, message: t('supplier.needManualRealNameRequired') }],
-    autoSyncUsage: [{ required: true, message: t('supplier.autoSyncUsageRequired') }],
-    useOperatorApi: [{ required: true, message: t('supplier.useOperatorApiRequired') }],
-    useOperatorDataPool: [{ required: true, message: t('supplier.useOperatorDataPoolRequired') }],
-    silentPeriod: [{ required: true, type: 'number', message: t('supplier.silentPeriodRequired') }],
-    // ... 可以根据需要添加其他字段的验证规则 ...
-};
-
-watch(() => props.editData, (newVal) => {
-    if (newVal) {
-        Object.assign(formData, newVal);
-    }
-}, { immediate: true });
-
-const handleSubmit = () => {
-    Promise.all([
-        formRef.value.validate(),
-        apiConfigFormRef.value.validate(),
-        advancedConfigFormRef.value.validate()
-    ]).then(([baseErrors, apiErrors, advancedErrors]) => {
-        const errors = [...(baseErrors || []), ...(apiErrors || []), ...(advancedErrors || [])];
-        if (errors.length === 0) {
-            emit('submit', { ...formData });
-            emit('update:visible', false);
-        } else {
-            console.error('Validation failed', errors);
-            Message.error(t('supplier.fillRequiredFields'));
-        }
-    }).catch((error) => {
-        console.error('Validation error', error);
-        Message.error(t('supplier.fillRequiredFields'));
-    });
-};
-
-const handleCancel = () => {
-    emit('update:visible', false);
-};
-</script>
-
-<style scoped>
-.arco-form-item {
-    margin-bottom: 18px;
-}
-</style>

+ 0 - 151
src/views/admin/supplier/index.vue

@@ -1,151 +0,0 @@
-<!-- 供应商管理 -->
-<template>
-    <div class="supplier-management">
-        <!-- 顶部操作区 -->
-        <!-- <div class="top-actions">
-            <a-space>
-                <a-button type="primary" @click="showNewSupplierForm">{{ $t('supplier.addSupplier') }}</a-button>
-            </a-space>
-        </div> -->
-
-        <!-- 搜索条件区 -->
-        <div class="search-section">
-            <a-form :model="searchForm" layout="inline">
-                <a-form-item field="supplierName" :label="$t('supplier.supplierName')">
-                    <a-input v-model="searchForm.supplierName" :placeholder="$t('supplier.enterSupplierName')"
-                        allow-clear />
-                </a-form-item>
-                <a-form-item field="operatorType" :label="$t('supplier.operatorType')">
-                    <a-select v-model="searchForm.operatorType" :placeholder="$t('supplier.selectOperatorType')"
-                        allow-clear style="width: 160px">
-                        <a-option v-for="op in operatorTypeOptions" :key="op.value" :value="op.value">
-                            {{ $t(`supplier.operatorTypes.${op.value}`) }}
-                        </a-option>
-                    </a-select>
-                </a-form-item>
-                <a-form-item>
-                    <a-button type="primary" @click="handleSearch">{{ $t('global.common.search') }}</a-button>
-                </a-form-item>
-                <a-form-item>
-                    <a-button @click="resetSearch">{{ $t('global.common.reset') }}</a-button>
-                </a-form-item>
-            </a-form>
-        </div>
-
-        <!-- 数据表格 -->
-        <a-table :columns="columns" :data="tableData" :pagination="pagination" :scroll="{ x: '100%', y: '400px' }">
-            <template #operation="{ record }">
-                <a-space>
-                    <a-button type="text" size="small" @click="handleEdit(record)">{{ $t('global.common.edit')
-                        }}</a-button>
-                    <a-button type="text" size="small" @click="handleDelete(record)">{{ $t('global.common.delete')
-                        }}</a-button>
-                </a-space>
-            </template>
-        </a-table>
-
-        <!-- 新供应商表单对话框 -->
-        <new-supplier-form v-model:visible="newSupplierFormVisible" :editMode="editMode" :editData="editData"
-            @submit="handleNewSupplierSubmit" />
-    </div>
-</template>
-
-<script setup>
-import { ref, reactive, computed } from 'vue';
-import { Message } from '@arco-design/web-vue';
-import { useI18n } from 'vue-i18n';
-import NewSupplierForm from './NewSupplierForm.vue';
-
-const { t } = useI18n();
-
-const columns = computed(() => [
-    { title: t('supplier.id'), dataIndex: 'id' },
-    { title: t('supplier.operatorCode'), dataIndex: 'operatorCode' },
-    { title: t('supplier.operatorName'), dataIndex: 'operatorName' },
-    { title: t('supplier.operatorType'), dataIndex: 'operatorType' },
-    { title: t('supplier.updateTime'), dataIndex: 'updateTime' },
-    { title: t('global.common.operations'), slotName: 'operation', width: 150 },
-]);
-
-const tableData = reactive([]);
-
-const pagination = reactive({
-    total: 0,
-    current: 1,
-    pageSize: 10,
-});
-
-const newSupplierFormVisible = ref(false);
-const editMode = ref(false);
-const editData = ref(null);
-
-const showNewSupplierForm = () => {
-    editMode.value = false;
-    editData.value = null;
-    newSupplierFormVisible.value = true;
-};
-
-const handleEdit = (record) => {
-    editMode.value = true;
-    editData.value = { ...record };
-    newSupplierFormVisible.value = true;
-};
-
-const handleDelete = (record) => {
-    Message.success(`已删除供应商 ${record.operatorName}`);
-    const index = tableData.findIndex(item => item.id === record.id);
-    if (index !== -1) {
-        tableData.splice(index, 1);
-    }
-};
-
-const handleNewSupplierSubmit = (formData) => {
-    if (editMode.value) {
-        console.log('Edited supplier submitted:', formData);
-        Message.success(`已更新供应商 ${formData.operatorName}`);
-    } else {
-        console.log('New supplier submitted:', formData);
-        Message.success(`已添加新供应商 ${formData.operatorName}`);
-    }
-};
-
-const searchForm = reactive({
-    supplierName: '',
-    operatorType: '',
-});
-
-const operatorTypeOptions = [
-    { label: t('supplier.operatorTypes.foreign_local'), value: 'foreign_local' },
-    { label: t('supplier.operatorTypes.international'), value: 'international' },
-];
-
-const handleSearch = () => {
-    console.log('Search form data:', searchForm);
-    Message.success(t('supplier.searchExecuted'));
-};
-
-const resetSearch = () => {
-    Object.keys(searchForm).forEach(key => {
-        searchForm[key] = '';
-    });
-    Message.success(t('supplier.searchReset'));
-};
-</script>
-
-<style scoped>
-.supplier-management {
-    padding: 20px !important;
-}
-
-.top-actions {
-    margin-bottom: 20px;
-}
-
-.search-section {
-    margin-bottom: 20px;
-}
-
-.supplier-management .arco-table-th {
-    white-space: nowrap;
-}
-</style>

+ 0 - 356
src/views/admin/tariffManagement/Management/add.vue

@@ -1,356 +0,0 @@
-<template>
-    <!--资费 弹框 -->
-    <a-modal :title="typeIndexSet == 1 ? $t('form.Add') : $t('form.Edit')" v-model:visible="modelValue"
-        @onCancel="resetForm" centered :maskClosable="false" :footer="null" width="700px" :closable="false">
-        <a-form ref="formRef" :rules="rules" :model="formState" @submit="handleSubmit">
-            <div class="formTitle">{{ $t('tariffManagement.BasicInformation') }}</div>
-            <a-form-item :label="$t('tariffManagement.source')" field="source">
-                <a-select v-model="formState.source">
-                    <a-option v-for=" item in sourceList" :key="item.id" :value="item.value">{{
-                        item.label
-                    }}
-                    </a-option>
-                </a-select>
-            </a-form-item>
-            <template v-if="formState.source">
-                <a-form-item :label="$t('tariffManagement.simDataPlanId')" field="simDataPlanId">
-                    <a-select v-model="formState.simDataPlanId" :disabled="typeIndexSet !== 1">
-                        <a-option v-for=" (item, index) in planList" :key="item.id" :value="item.productId">{{
-                            $t('tariffManagement.simDataPlanId') }} {{
-                                item.productName
-                            }}
-                        </a-option>
-                    </a-select>
-                </a-form-item>
-            </template>
-            <!-- <template v-if="formState.source">
-                <a-form-item :label="$t('tariffManagement.TestFlowPacket')" field="testSimDataPlanId">
-                    <a-select v-model="formState.testSimDataPlanId">
-                        <a-option v-for=" (item, index) in planList" :key="item.id" :value="item.productId">{{
-                            $t('tariffManagement.TestFlowPacket') }} {{
-                                item.productName
-                            }}
-                        </a-option>
-                    </a-select>
-                </a-form-item>
-            </template> -->
-            <a-form-item :label="$t('tariffManagement.label')" field="label">
-                <a-input v-model="formState.label" />
-            </a-form-item>
-            <a-form-item :label="$t('tariffManagement.userId')" field="userId">
-                <a-select v-model="formState.userId">
-                    <a-option v-for=" item in userIdList" :key="item.id" :value="item.id">{{
-                        item.name
-                    }}
-                    </a-option>
-                </a-select>
-            </a-form-item>
-            <a-form-item :label="$t('tariffManagement.pricingUser')" field="billingMethod">
-                <a-select v-model="formState.billingMethod">
-                    <a-option v-for=" item in methodList" :key="item.id" :value="item.value">{{
-                        item.label
-                    }}
-                    </a-option>
-                </a-select>
-            </a-form-item>
-            <a-form-item :label="$t('tariffManagement.currency')" field="currency">
-                <a-select v-model="formState.currency">
-                    <a-option v-for=" item in currency" :key="item.id" :value="item.value">{{
-                        item.label
-                    }}
-                    </a-option>
-                </a-select>
-            </a-form-item>
-            <div class="formTitle">{{ $t('tariffManagement.BillingInformation') }}</div>
-            <a-form-item field="billingCycle" label="账单账单计费周期" required>
-                <a-radio-group v-model="formState.billingCycle" :options="billingCycleData">
-                </a-radio-group>
-            </a-form-item>
-            <a-form-item field="" :label="$t('tariffManagement.pricing')" required>
-                <a-input v-model="formState.pricing" v-if="formState.billingMethod == 2">
-                    <template #append>
-                        {{ formState.currency }}
-                    </template>
-                </a-input>
-                <a-input v-model="formState.trafficBilling" v-if="formState.billingMethod == 1"></a-input>
-                <a-select v-model="formState.trafficBillingType" style="width: 80px; margin:0 8px;"
-                    v-if="formState.billingMethod == 1">
-                    <a-option value="MB">MB</a-option>
-                    <a-option value="GB">GB</a-option>
-                    <a-option value="KB">KB</a-option>
-                </a-select>
-                <a-input v-model="formState.trafficBillingAmount" v-if="formState.billingMethod == 1">
-                    <template #append>
-                        {{ formState.currency }}
-                    </template>
-                </a-input>
-            </a-form-item>
-            <a-form-item label="原价" >
-                <a-input v-model="formState.oldPricing" v-if="formState.billingMethod == 2">
-                    <template #append>
-                        {{ formState.currency }}
-                    </template>
-                </a-input>
-                <a-input v-model="formState.oldTrafficBilling" v-if="formState.billingMethod == 1"></a-input>
-                <a-select v-model="formState.oldTrafficBillingType" style="width: 80px; margin:0 8px;"
-                    v-if="formState.billingMethod == 1">
-                    <a-option value="MB">MB</a-option>
-                    <a-option value="GB">GB</a-option>
-                    <a-option value="KB">KB</a-option>
-                </a-select>
-                <a-input v-model="formState.oldTrafficBillingAmount" v-if="formState.billingMethod == 1">
-                    <template #append>
-                        {{ formState.currency }}
-                    </template>
-                </a-input>
-            </a-form-item>
-            <a-form-item field="endDate" :label="$t('tariffManagement.cycleBuy')">
-                <a-date-picker v-model="formState.endDate" style="width: 100%;" />
-            </a-form-item>
-            <a-form-item :label="$t('tariffManagement.MRCName')" field="mrcAmount">
-                <a-input v-model="formState.mrcAmount">
-                    <template #append>
-                        {{ formState.currency }}
-                    </template>
-                </a-input>
-            </a-form-item>
-            <a-form-item :label="$t('tariffManagement.networkName')" field="networkAccessFee">
-                <a-input v-model="formState.networkAccessFee">
-                    <template #append>
-                        {{ formState.currency }}
-                    </template>
-                </a-input>
-            </a-form-item>
-            <a-form-item>
-                <a-button type="primary" html-type="submit" style="margin-right: 10px;">{{
-                    $t('form.Confirm')
-                }}
-                </a-button>
-                <a-button @click="resetForm">{{ $t('form.Cancel') }}</a-button>
-            </a-form-item>
-        </a-form>
-    </a-modal>
-</template>
-
-<script setup>
-import { ref, onMounted, toRefs, toRef, watch, defineExpose } from 'vue';
-import { getDataPlanList } from "@/api/path/lotCard.api"
-import { getSTSInfoList } from '@/api/path/system.api'
-import { updateTariff, addTariff } from "@/api/path/tariffManagement.api"
-import { Getdictionary } from '@/mixins/index.js'
-import { Message } from '@arco-design/web-vue'
-import { useI18n } from 'vue-i18n'
-const { t } = useI18n();
-const props = defineProps({
-    modelValue: {
-        type: Boolean,
-        default: false
-    },
-    typeIndex: {
-        type: Number,
-        default: null
-    },
-})
-
-const modelValue = toRef(props, 'modelValue')
-const typeIndexSet = ref(null)
-const emit = defineEmits(['update:modelValue', 'submit'])
-
-const state = ref({
-    formState: {
-        // 资费名称(必填)
-        "label": "",
-        // 流量包ID(必填)
-        "simDataPlanId": null,
-        // 用户ID(必填)
-        "userId": null,
-        // 来源(必填)
-        "source": "",
-        // 账单计费周期(必填)
-        "billingCycle": "",
-        // 流量结算方式(必填)
-        "billingMethod": "1",
-        // 价格(必填)
-        "pricing": "",
-        // 币种(必填)
-        "currency": "USD",
-        // 流量资费计费
-        "trafficBilling": '',
-        // 流量资费计费类型
-        "trafficBillingType": 'MB',
-        // 流量资费计费金
-        "trafficBillingAmount": '',
-        // MRC金额
-        "mrcAmount": '',
-        // 网络接入费
-        "networkAccessFee": '',
-        "endDate": '',
-        "oldPricing": "",
-        "oldTrafficBilling": "",
-        "oldTrafficBillingType": "MB",
-        "oldTrafficBillingAmount": ""
-    },
-    sourceList: [],
-    userIdList: [],
-    methodList: [],
-    currency: [],
-    billingCycleData: [],
-    planList: [],
-    formRef: null
-
-})
-
-const { formState, sourceList, userIdList, methodList, currency, billingCycleData, planList, formRef } = toRefs(state.value)
-
-const rules = {
-    label: [{ required: true, trigger: 'change', }],
-    simDataPlanId: [{ required: true, trigger: 'change', }],
-    userId: [{ required: true, trigger: 'change', }],
-    source: [{ required: true, trigger: 'change', }],
-    billingCycle: [{ required: true, trigger: 'change', }],
-    billingMethod: [{ required: true, trigger: 'change', }],
-    currency: [{ required: true, trigger: 'change', }],
-    trafficBilling: [{ required: true, trigger: 'change', }],
-    trafficBillingType: [{ required: true, trigger: 'change', }],
-    trafficBillingAmount: [{ required: true, trigger: 'change', }],
-    mrcAmount: [{ required: true, trigger: 'change', }],
-    networkAccessFee: [{ required: true, trigger: 'change', }],
-    endDate: [{ required: true, trigger: 'change', }],
-    productId: [{ required: true, trigger: 'change', }],
-};
-
-// 提交
-const handleSubmit = ({ values, errors }) => {
-    formRef.value.validate(async (errors) => {
-        if (!errors) {
-            const formVal = JSON.parse(JSON.stringify(values))
-            delete formVal.settlementCycleMap
-            formVal.userId = Number(values.userId)
-            formVal.simDataPlanId = String(values.simDataPlanId)
-            formVal.simDataPlanId = String(values.simDataPlanId)
-            formVal.pricing = Number(values.pricing)
-            formVal.oldPricing = Number(values.oldPricing)
-            if (typeIndexSet.value === 2) {
-                const { code, data } = await updateTariff(formVal)
-
-                if (code == 200) {
-                    Message.success({
-                        content: t('setting.editSuccess'),
-                        duration: 2000,
-                    })
-                    emit('update:modelValue', false)
-                    emit('submit', true)
-                    resetForm()
-                }
-            } else {
-                const { code, data } = await addTariff(formVal)
-                if (code == 200) {
-                    Message.success({
-                        content: t('setting.addSuccess'),
-                        duration: 2000,
-                    })
-                    emit('update:modelValue', false)
-                    emit('submit', true)
-                    resetForm()
-                }
-            }
-        }
-    });
-}
-
-// 取消
-const resetForm = () => {
-    emit('update:modelValue', false)
-    Object.keys(formState.value).forEach(key => {
-        if (
-            key != 'billingMethod' &&
-            key != 'currency' &&
-            key != 'trafficBillingType'
-        ) {
-            formState.value[key] = ''
-        }
-    })
-
-    delete formState.value.id
-}
-
-const handleDataPlan = async () => {
-    const param = {
-        current: 1,
-        size: 999,
-        source: formState.value.source
-    }
-    getDataPlanList(param).then(res => {
-        planList.value = res.data.records || []
-    })
-}
-
-// 获取用户
-const handleModelId = async () => {
-    const param = {
-        current: 1,
-        size: 999,
-    }
-    getSTSInfoList(param).then(res => {
-        userIdList.value = (res.data.records || [])
-    })
-}
-
-const handleDictValue = async () => {
-    sourceList.value = await Getdictionary('source')
-    methodList.value = await Getdictionary('billingMethod')
-    currency.value = await Getdictionary('currencyType')
-    billingCycleData.value = await Getdictionary('Billingcycle')
-}
-
-
-watch(() => formState.value.billingMethod, val => {
-    if (val == 2) {
-        formState.value.trafficBillingType = ''
-        formState.value.trafficBilling = ''
-        formState.value.trafficBillingAmount = ''
-        formState.value.oldTrafficBilling = ""
-        formState.value.oldTrafficBillingType = ""
-        formState.value.oldTrafficBillingAmount = ""
-    } else {
-        formState.value.pricing = ''
-        formState.value.trafficBillingType = 'MB'
-        formState.value.oldTrafficBillingType = "MB"
-    }
-})
-
-watch(
-    () => formState.value.source,
-    (newValue, oldValue) => {
-
-        if (newValue != oldValue) {
-            handleDataPlan()
-        }
-    },
-    { immediate: true, deep: true }
-);
-
-watch(() => props.typeIndex, val => {
-    if (val == null) return
-    typeIndexSet.value = val
-}, { immediate: true })
-
-const detaile = (val) => {
-    console.log(val);
-    if (!val) return
-    Object.keys(formState.value).forEach(key => {
-        if (val[key]) {
-            formState.value[key] = key === 'userId' ? Number(val[key]) : val[key];
-        }
-    })
-    formState.value.id = val.id
-}
-
-onMounted(() => {
-    handleDictValue()
-    handleModelId()
-})
-
-defineExpose({ detaile })
-</script>
-<style scoped></style>

+ 0 - 298
src/views/admin/tariffManagement/SetMeal/addSetMeal.vue

@@ -1,298 +0,0 @@
-<template>
-    <div>
-        <div class="search">
-            <Search :SearchForm="SetMealSearchForm" @query="initData" @reset="reset"></Search>
-        </div>
-
-        <div class="addSetMeal">
-            <a-button type="primary" @click="visible = true; Edit = true; Type = true">新增套餐</a-button>
-            <a-button @click="breakFlos">返回</a-button>
-        </div>
-
-        <div class="table">
-            <a-table row-key="id" :data="tableData" :columns="columnsTarrit" :pagination="pagination"
-                :scroll="{ x: 'auto' }" @page-change="evChangePage">
-                <template #status="{ record }">
-                    <a-tag :color="record.status == 1 ? '#7bc616' : '#86909c'">{{ record.status == 1 ? '上架' : '下架'
-                        }}</a-tag>
-                </template>
-                <template #options="{ record }">
-                    <a-space>
-                        <a-button type="text" @click="SetUpPackage(record)">修改</a-button>
-                        <a-button type="text" @click="unmount(record)">{{ record.status == 1 ? '下架' : '上架' }}</a-button>
-                        <a-popconfirm content="是否要删除该资费商品?" @ok="handelDeleteTariff(record)">
-                            <a-button type="text">删除</a-button>
-                        </a-popconfirm>
-                    </a-space>
-                </template>
-            </a-table>
-        </div>
-
-
-        <a-modal v-model:visible="visible" width="600px" @cancel="handelCancel" :title="Edit ? '新增套餐计划商品' : '编辑套餐计划商品'">
-            <div class="Form">
-                <a-form ref="formRef" :rules="rules" :model="Form">
-                    <a-form-item label="套餐名称" field="label" validate-trigger="input">
-                        <a-input placeholder="请输入套餐名称" v-model="Form.label"></a-input>
-                    </a-form-item>
-                    <div class="title">套餐名称将在终端用户的充值也中展示,建议不超过10个字</div>
-                    <a-form-item label="充值类型" field="type" validate-trigger="input">
-                        <a-select v-model="Form.type" placeholder="请选择充值类型">
-                            <a-option v-for="item in puyType" :value="item.value" :key="item.value">{{ item.label
-                                }}</a-option>
-                        </a-select>
-                    </a-form-item>
-                    <a-form-item label="充值周期" field="period" validate-trigger="input">
-                        <a-input v-model="Form.period"></a-input>
-                        <a-select v-model="Form.timeUnit" style="width: 140px; margin:0 8px;">
-                            <a-option v-for="item in cyciy" :value="item.value" :key="item.value">{{ item.label
-                                }}</a-option>
-                        </a-select>
-                    </a-form-item>
-                    <a-form-item label="充值售价" field="price" validate-trigger="input">
-                        <a-input v-model="Form.price"></a-input>
-                        <a-select v-model="Form.currency" style="width: 140px; margin:0 8px;">
-                            <a-option v-for="item in Currency" :value="item.value" :key="item.value">{{ item.label
-                                }}</a-option>
-                        </a-select>
-                    </a-form-item>
-                    <a-form-item :label="Edit ? '充值绑定资费' : '默认绑定资费'" field="trafficId" validate-trigger="blur">
-                        <a-select v-model="Form.trafficId">
-                            <a-option v-for="item in tariffListData" :value="item.id" :key="item.id">{{ item.label
-                                }}</a-option>
-                        </a-select>
-                    </a-form-item>
-                    <div class="title">若更改绑定资费后已充值的用户仍使用之前的资费请谨慎操作!!</div>
-                    <a-form-item label="流量大小" field="Flow" validate-trigger="change" v-if="Form.type == 2">
-                        <a-input v-model="Form.flow"></a-input>
-                        <a-select v-model="Form.flowUnit" style="width: 140px; margin:0 8px;">
-                            <a-option value="KB">KB</a-option>
-                            <a-option value="MB">MB</a-option>
-                            <a-option value="GB">GB</a-option>
-                        </a-select>
-                    </a-form-item>
-                </a-form>
-            </div>
-            <template #footer>
-                <a-button @click="handelCancel">取消</a-button>
-                <a-button type="primary" @click="handleSubmit">确定</a-button>
-            </template>
-        </a-modal>
-    </div>
-</template>
-
-<script setup>
-import { defineEmits, defineProps, toRefs, ref, onMounted } from 'vue';
-import { CheckTariffPackages } from '@/api/path/tariffManagement.api'
-import { Getdictionary, tableFunction, filterDict } from '@/mixins/index.js'
-import Search from '@/components/Search/index.vue'
-import { columnsTarrit } from '../config'
-import { tariffList, addTariffPackage, UpdateTariffTtems, DeleteTariffItems } from "@/api/path/tariffManagement.api"
-import { Message, Modal } from '@arco-design/web-vue';
-const props = defineProps({
-    list: Object
-})
-
-const emits = defineEmits(['break'])
-
-const state = ref({
-    pagination: {
-        total: 0,
-        pageSize: 10,
-        current: 1,
-        simTerminalId: null
-    },
-    visible: false,
-    puyType: [],
-    cyciy: [],
-    Currency: [],
-    tariffListData: [],
-    billingMethodList: [],
-    Form: {
-        label: '',
-        type: "",
-        period: "",
-        timeUnit: "",
-        price: "",
-        currency: "",
-        trafficId: "",
-        flow: "",
-        flowUnit: "MB",
-        id: "",
-    },
-    formRef: null,
-    Edit: true,
-    Type: true
-})
-const { pagination, visible, puyType, Currency, cyciy, tariffListData, Form, formRef, billingMethodList, Edit, Type } = toRefs(state.value)
-
-const rules = {
-    label: [{ required: true, message: '套餐名称不能为空' }],
-    type: [{ required: true, message: '请选择充值类型' }],
-    period: [{ required: true, message: '请填写充值周期' }, {
-        validator: (value, cb) => {
-            const pattern = /^[1-9]\d*$/
-            if (!pattern.test(value)) {
-                cb('请输入整数')
-            } else {
-                cb()
-            }
-        }
-    }],
-    price: [
-        { required: true, message: '请填写充值售价' },
-        {
-            validator: (value, cb) => {
-                // 修改正则表达式,使其支持最多两位小数
-                const pattern = /^\d+(\.\d{1,2})?$/;
-                if (!pattern.test(value)) {
-                    cb('请输入合法的数字,最多支持两位小数');
-                } else {
-                    cb();
-                }
-            }
-        }
-    ],
-    trafficId: [{ required: true, message: '请选择充值绑定资费' }]
-}
-
-const processData = (data) => {
-    return (data.records || []).map((item, index) => {
-        return {
-            ...item,
-            priceName: item.price + item.currency,
-            typeName: item.type == 1 ? '服务时长' : "购买流量",
-            profitPrice: item.billingMethod == 1 ? '---' : item.profitPrice + item.currency,
-            billingMethod: filterDict(billingMethodList.value, item.billingMethod),
-            costPrice: item.billingMethod == 1? item.trafficBilling+item.trafficBillingType+'/'+ item.trafficBillingAmount +item.trafficCurrency  : item.costPrice + item.trafficCurrency,
-            oldPrice: item.billingMethod == 1 ? item.oldTrafficBilling+item.oldTrafficBillingType+'/'+ item.oldTrafficBillingAmount +item.trafficCurrency : item.oldPrice + item.trafficCurrency,
-        }
-    })
-}
-
-const { tableData, evChangePage, initData, reset } = tableFunction(pagination.value, CheckTariffPackages, processData)
-
-
-const handleSubmit = () => {
-    formRef.value.validate(async (errors) => {
-        if (!errors) {
-            const FormList = {
-                ...Form.value,
-                type: Number(Form.value.type),
-                period: Number(Form.value.period),
-                simTerminalId: pagination.value.simTerminalId
-            }
-            if (Edit.value) {
-                delete FormList.id
-            }
-            let res = Type.value ? await addTariffPackage(FormList) : await UpdateTariffTtems(FormList)
-            if (res.code === 200) {
-                initData()
-                Message.success(Type.value ? '添加成功' : '修改成功')
-                visible.value = false
-                handelCancel()
-            }
-        }
-    })
-}
-
-const handelCancel = () => {
-    Form.value.label = ""
-    Form.value.type = puyType.value[0]?.value
-    Form.value.period = ""
-    Form.value.timeUnit = cyciy.value[0]?.value
-    Form.value.price = ""
-    Form.value.currency = Currency.value[0]?.value
-    Form.value.trafficId = null
-    Edit.value = true
-    visible.value = false
-
-}
-
-
-const unmount = async (record) => {
-    Modal.info({
-        title: `确定要${record.status == 1 ? '下架' : '上架'}吗?`,
-        content: '',
-        onOk: async () => {
-            const FormList = {
-                ...record,
-                type: Number(Form.value.type),
-                period: Number(Form.value.period),
-                simTerminalId: pagination.value.simTerminalId
-            }
-            let res = await UpdateTariffTtems(FormList)
-            if (res.code === 200) {
-                Message.success(`${record.status == 1 ? '下架' : '上架'}成功`)
-                initData()
-            }
-        }
-    });
-}
-
-const handelDeleteTariff = async (record) => {
-    let res = await DeleteTariffItems({ id: record.id })
-    if (res.code === 200) {
-        Message.success('删除成功')
-        initData()
-    }
-}
-
-const SetUpPackage = async (record) => {
-    Object.keys(Form.value).forEach(key => {
-        Form.value[key] = record[key]
-    })
-    Form.value.price = record.price.split('/')[0];
-    Form.value.type = String(Form.value.type)
-    visible.value = true
-    Edit.value = false
-    Type.value = false
-}
-
-const breakFlos = () => {
-    emits('break', true)
-}
-
-onMounted(async () => {
-    let dict = await Getdictionary(['RechargeType', 'PuyCycle', 'currencyType', 'billingMethod'])
-    puyType.value = dict[0]
-    Form.value.type = puyType.value[0]?.value
-    cyciy.value = dict[1]
-    Form.value.timeUnit = cyciy.value[0]?.value
-    Currency.value = dict[2]
-    Form.value.currency = Currency.value[0]?.value
-    billingMethodList.value = dict[3]
-    let res = await tariffList({ current: 1, size: 99999, source: props.list.source, userId: props.list.userId })
-    if (res.code === 200) {
-        tariffListData.value = (res.data.records || []).map(item => {
-            return {
-                ...item,
-                value: item.id,
-                label: item.label + '---' + item.userName
-            }
-        })
-    }
-    pagination.value.simTerminalId = props.list.id
-    initData()
-})
-</script>
-
-<style scoped lang='less'>
-.search,
-.table {
-    margin-top: 20px;
-}
-
-.addSetMeal {
-    display: flex;
-    justify-content: space-between;
-}
-
-.title {
-    font-size: 14px;
-    color: #ccc;
-    margin-left: 120px;
-    margin-top: -15px;
-    margin-bottom: 10px;
-}
-</style>

+ 0 - 233
src/views/admin/tariffManagement/SetMeal/index.vue

@@ -1,233 +0,0 @@
-<template>
-  <div>
-    <template v-if="AddSet">
-      <div class="search">
-        <Search :SearchForm="SetMealSearchForm" @query="initData" @reset="reset"></Search>
-      </div>
-
-      <div class="addSetMeal">
-        <a-button type="primary" @click="visibleSetMeal = true">新增套餐计划</a-button>
-      </div>
-
-      <div class="table">
-        <a-table row-key="id" :data="tableData" :columns="columnsSetMeal" :pagination="pagination"
-          :scroll="{ x: 'auto' }" @page-change="evChangePage">
-          <template #status="{ record }">
-            <a-tag :color="record.status == 1 ? '#7bc616' : '#86909c'">{{ record.status == 1 ? '上架' : '下架' }}</a-tag>
-          </template>
-          <template #Controls="{ record }">
-            <a-space>
-              <a-button type="text" @click="SetUpPackage(record)" v-if="record.isRecharge == 1"> 设置套餐</a-button>
-              <a-button type="text" @click="unmount(record)">{{ record.status == 1 ? '下架' : '上架' }}</a-button>
-            </a-space>
-          </template>
-          <template #isRechargeName="{ record }">
-            {{ filterDict(SetMealList, record.isRecharge) }}
-          </template>
-          <template #defaultTrafficName="{ record }">
-            {{ record.defaultTraffic?.label || ''}}
-          </template>
-        </a-table>
-      </div>
-    </template>
-
-    <a-modal v-model:visible="visibleSetMeal" width="600px" @cancel="handelCancel" title="新增套餐计划">
-      <div class="Form">
-        <a-form ref="formRef" :rules="rules" :model="Form">
-          <a-form-item label="套餐计划名称" field="label" validate-trigger="blur">
-            <a-input placeholder="请输入套餐计划名称" v-model="Form.label"></a-input>
-          </a-form-item>
-          <a-form-item label="选择所属客户" field="userId" validate-trigger="blur">
-            <a-select :style="{ width: '320px' }" v-model="Form.userId" placeholder="请选择所属客户">
-              <a-option v-for="(item, index) in userList" :value="item.id">{{ item.name }}</a-option>
-            </a-select>
-          </a-form-item>
-          <a-form-item label="运营商" field="source" validate-trigger="blur">
-            <a-select :style="{ width: '320px' }" v-model="Form.source" placeholder="请选择运营商">
-              <a-option v-for="(item, index) in sourceList" :value="item.value">{{ item.label }}</a-option>
-            </a-select>
-          </a-form-item>
-          <a-form-item label="套餐计划类型" field="isRecharge">
-            <a-radio-group v-model="Form.isRecharge" :options="SetMealList" />
-          </a-form-item>
-          <div class="title" v-if="Form.isRecharge==1">此类型下,一个套餐计划代表一个充值二维码请在下载粘贴二维码时仔细核对</div>
-          <div class="title" v-if="Form.isRecharge==2">非充值类型套餐计划,则无需用户充值,导卡成功充值后用户可直接使用流量</div>
-          <a-form-item label="默认绑定资费" >
-            <a-select v-model="Form.defaultTrafficId">
-              <a-option v-for="item in tariffListData" :value="item.id" :key="item.id">{{ item.label
-                }}</a-option>
-            </a-select>
-          </a-form-item>
-        </a-form>
-      </div>
-      <template #footer>
-        <a-button @click="handelCancel">取消</a-button>
-        <a-button type="primary" @click="handleSubmit">确定</a-button>
-      </template>
-    </a-modal>
-    <!-- 新增套餐计划 -->
-    <AddSetMeal v-if="!AddSet" :list="list" @break="AddSet = true" />
-  </div>
-
-</template>
-
-<script setup>
-import { ref, onMounted, toRefs, watch } from 'vue';
-import Search from '@/components/Search/index.vue'
-import { SetMealSearchForm, columnsSetMeal } from '../config.js'
-import { getMessUserList, } from '@/api/customer.js';
-import { PackageSchedule, addTariffSchedule, PackageTakedown, tariffList } from '@/api/path/tariffManagement.api.js'
-import QrcodeVue from 'qrcode.vue'
-import { Getdictionary, tableFunction, filterDict } from '@/mixins/index.js'
-import { Message, Modal } from '@arco-design/web-vue';
-import AddSetMeal from './addSetMeal.vue'
-const formRef = ref(null);
-const rules = {
-  userId: [
-    { required: true, message: '请选择所属客户', trigger: 'blur' },
-  ],
-  label: [
-    { required: true, message: '请输入套餐计划名称', trigger: 'blur' },
-  ],
-  source: [
-    { required: true, message: '请选择运营商', trigger: 'blur' },
-  ],
-};
-
-
-const state = ref({
-  pagination: {
-    total: 0,
-    pageSize: 10,
-    current: 1,
-  },
-  visibleSetMeal: false,
-  Form: {
-    userId: null,
-    label: null,
-    isRecharge: '1',
-    defaultTrafficId: null,
-    source: null
-  },
-  userList: [],
-  SetMealList: [],
-  tariffListData: [],
-  sourceList:[],
-  AddSet: true,
-  list: {}
-})
-const { pagination, visibleSetMeal, userList, Form, AddSet, SetMealList, tariffListData, sourceList, list } = toRefs(state.value)
-
-
-const { tableData, evChangePage, initData, reset } = tableFunction(pagination.value, PackageSchedule)
-
-const fetchCustomerList = async (item) => {
-  const response = await getMessUserList({
-    current: 1,
-    pageSize: 99999,
-  });
-  if (response.code === 200 && response.data) {
-    userList.value = response.data.records
-  }
-};
-
-
-const handleSubmit = ({ values, errors }) => {
-  formRef.value.validate(async (values, errors) => {
-    if (!errors) {
-      if (Form.value.isRecharge == 1 && Form.value.defaultTrafficId == null) return Message.error('请选择充值绑定资费')
-      Form.value.isRecharge = Number(Form.value.isRecharge)
-      const response = await addTariffSchedule(Form.value)
-      if (response.code === 200) {
-        Message.success('添加成功')
-        visibleSetMeal.value = false
-        initData()
-      } else {
-        console.log(response)
-      }
-    }
-  })
-}
-
-const unmount = async (record) => {
-  Modal.info({
-    title: `确定要${record.status == 1 ? '下架' : '上架'}吗?`,
-    content: '',
-    onOk: async () => {
-      let res = await PackageTakedown({ id: record.id, status: record.status == 1 ? 2 : 1, label: record.label, userId: record.userId })
-      if (res.code === 200) {
-        Message.success(`${record.status == 1 ? '下架' : '上架'}成功`)
-        initData()
-      }
-    }
-  });
-}
-
-const SetUpPackage = (item) => {
-  list.value.id = item.id
-  list.value.source = item.source
-  list.value.userId = item.userId
-  AddSet.value = false
-}
-
-const handelCancel = () => {
-  Object.keys(Form.value).forEach(res => {
-    Form.value[res] = null
-  })
-  visibleSetMeal.value = false
-  Form.value.isRecharge = "1"
-}
-
-
-watch(() => Form.value.userId, val => {
-  getTarrife(val)
-}, { deep: true })
-
-watch(() => Form.value.source, val => {
-  getTarrife(Form.value.userId, val)
-}, { deep: true })
-
-// 资费
-const getTarrife = async (item, sourceId) => {
-  let res = await tariffList({ current: 1, size: 99999, userId: item, source: sourceId })
-  tariffListData.value = []
-  Form.value.defaultTrafficId = null
-  if (res.code === 200) {
-    tariffListData.value = (res.data.records || []).map(item => {
-      return {
-        ...item,
-        value: item.id,
-        label: item.label + '---' + item.userName
-      }
-    })
-  }
-}
-
-onMounted(async () => {
-  let dict = await Getdictionary(['setMeal', 'source'])
-  SetMealList.value = dict[0]
-  sourceList.value = dict[1]
-  initData()
-  fetchCustomerList()
-  getTarrife()
-})
-</script>
-<style lang="less" scoped>
-.search,
-.table {
-  margin-top: 1rem;
-}
-
-.code {
-  justify-content: center;
-  display: flex;
-}
-
-.title {
-    font-size: 14px;
-    color: #ccc;
-    margin-left: 120px;
-    margin-top: -15px;
-    margin-bottom: 10px;
-}
-</style>

+ 0 - 151
src/views/admin/tariffManagement/TariffRecord/index.vue

@@ -1,151 +0,0 @@
-<!-- 资费管理 -->
-<template>
-  <div class="container">
-    <!-- 搜索条件区 -->
-    <div class="search-section">
-      <Search :SearchForm="trafficSearchFromOperationLog" @query="initData" @reset="reset" />
-    </div>
-    <a-table row-key="id" :data="tableData" :columns="columnsOperationLog" :pagination="pagination" :scroll="{ x: 'auto' }"
-      @page-change="evChangePage">
-      <template #id="{ record }">
-        <a-button type="text" @click="detaile(record)">详情</a-button>
-      </template>
-    </a-table>
-  </div>
-</template>
-
-<script setup>
-import { onMounted, ref, toRefs } from "vue";
-import { columnsOperationLog, trafficSearchFromOperationLog } from "../config";
-import { tariffList } from "@/api/path/tariffManagement.api"
-import { Getdictionary, tableFunction, filterDict } from '@/mixins/index.js'
-import Search from '@/components/Search/index.vue'
-const state = ref({
-  searchForm: {},
-  currency: [],
-  pagination: {
-    total: 0,
-    pageSize: 10,
-    current: 1,
-  },
-  sourceList: [],
-  cycleist: [],
-  methodList: [],
-})
-const {
-  currency,
-  pagination,
-  sourceList,
-  cycleist,
-  methodList
-} = toRefs(state.value);
-
-const processData = (data) => {
-  return (data.records || []).map((item, index) => {
-    item.children = item.children?.map(res => {
-      return {
-        ...res,
-        userName: item.userName,
-        sourceName: filterDict(sourceList.value, item.source),
-        pricingName: item.billingMethod == 1 ? item.trafficBillingAmount + filterDict(currency.value, item.currency) : item.pricing + filterDict(currency.value, item.currency),
-        billingCycleName: filterDict(cycleist.value, item.billingCycle),
-        Activated: item.trafficBilling + item.trafficBillingType,
-        status: "正常",
-        bagSize: item.pricing + '/' + item.mrcAmount + '/' + item.networkAccessFee,
-        billingMethodName: filterDict(methodList.value, item.billingMethod),
-        Number: index + 1,
-        metadataPackagesName: item.metadataPackagesName,
-        testMetadataPackagesName: item.testMetadataPackagesName,
-      }
-    })
-    return {
-      ...item,
-      sourceName: filterDict(sourceList.value, item.source),
-      pricingName: item.billingMethod == 1 ? item.trafficBillingAmount + filterDict(currency.value, item.currency) : item.pricing + filterDict(currency.value, item.currency),
-      billingCycleName: filterDict(cycleist.value, item.billingCycle),
-      Activated: item.trafficBilling + item.trafficBillingType,
-      status: "正常",
-      bagSize: item.pricing + '/' + item.mrcAmount + '/' + item.networkAccessFee,
-      billingMethodName: filterDict(methodList.value, item.billingMethod),
-      Number: index + 1,
-    }
-  })
-}
-
-const { tableData, evChangePage, initData, reset } = tableFunction(pagination.value, tariffList, processData)
-
-
-
-const handleDictValue = async () => {
-  let dict = await Getdictionary(['source', 'Billingcycle', 'currencyType', 'billingMethod'])
-  sourceList.value = dict[0]
-  cycleist.value = dict[1]
-  currency.value = dict[2]
-  methodList.value = dict[3]
-}
-
-
-onMounted(async () => {
-  await handleDictValue()
-  await initData()
-})
-
-
-</script>
-
-<style scoped lang="less">
-.head-title-right {
-  .m-r-10 {
-    margin-right: 10px;
-  }
-
-}
-
-.search-section {
-  margin-top: 20px;
-  margin-bottom: 20px;
-}
-
-.container {
-  .head-title {
-    display: flex;
-    justify-content: space-between;
-  }
-
-  .form-row {
-    display: flex;
-
-    .form-row-col {
-      width: 25%;
-      display: flex;
-      align-items: center;
-
-      .form-row-label {
-        width: 120px;
-        text-align: right;
-      }
-    }
-  }
-}
-
-.audit-btn {
-  margin-bottom: 10px;
-}
-
-.formTitle {
-  font-size: 18px;
-  margin-bottom: 20px;
-  display: flex;
-  align-items: center
-}
-
-.formTitle::before {
-  content: "";
-  display: inline-block;
-  width: 4px;
-  height: 20px;
-  background-color: green;
-  margin-right: 10px;
-
-}
-</style>

+ 0 - 558
src/views/admin/tariffManagement/config.js

@@ -1,558 +0,0 @@
-export let columns = [
-  {
-    title: window.$t("tariffManagement.id"),
-    dataIndex: "Number",
-    align: "center",
-    width: 200,
-    ellipsis: true,
-  },
-  {
-    title: window.$t("tariffManagement.userName"),
-    dataIndex: "userName",
-    align: "center",
-    width: 200,
-    ellipsis: true,
-  },
-  {
-    title: window.$t("tariffManagement.label"),
-    dataIndex: "label",
-    align: "center",
-    width: 200,
-    ellipsis: true,
-  },
-  {
-    title: window.$t("tariffManagement.source"),
-    dataIndex: "sourceName",
-    align: "center",
-    width: 200,
-    ellipsis: true,
-  },
-  {
-    title: window.$t("tariffManagement.simDataPlanIdName"),
-    dataIndex: "metadataPackagesName",
-    align: "center",
-    width: 200,
-    ellipsis: true,
-  },
-  {
-    title: window.$t("tariffManagement.billingCycleUser"),
-    dataIndex: "billingCycleName",
-    align: "center",
-    width: 200,
-    ellipsis: true,
-  },
-  {
-    title: window.$t("tariffManagement.pricingUser"),
-    dataIndex: "billingMethodName",
-    align: "center",
-    width: 200,
-    ellipsis: true,
-  },
-  {
-    title: window.$t("tariffManagement.pricing"),
-    dataIndex: "pricingName",
-    align: "center",
-    width: 200,
-    ellipsis: true,
-  },
-  {
-    title: window.$t("tariffManagement.feeStatus"),
-    dataIndex: "status",
-    align: "center",
-    width: 200,
-    ellipsis: true,
-  },
-  {
-    title: window.$t("tariffManagement.MRCName"),
-    dataIndex: "mrcAmount",
-    align: "center",
-    width: 200,
-    ellipsis: true,
-  },
-  {
-    title: window.$t("tariffManagement.networkName"),
-    dataIndex: "networkAccessFee",
-    align: "center",
-    width: 200,
-    ellipsis: true,
-  },
-  {
-    title: window.$t("tariffManagement.endDate"),
-    dataIndex: "endDate",
-    align: "center",
-    width: 200,
-    ellipsis: true,
-  },
-  {
-    title: window.$t("global.common.operations"),
-    dataIndex: "id",
-    slotName: "id",
-    align: "center",
-    width: 180,
-    fixed: "right",
-  },
-];
-
-
-
-export const SetMealSearchForm = [
-  {
-    type: "input",
-    label: "客户名称",
-    field: "name",
-    value: "", // 双向绑定的值
-  },
-  {
-    type: "input",
-    label: "客户编号",
-    field: "num",
-    value: "", // 双向绑定的值
-  },
-  {
-    type: "input",
-    label: "套餐名称",
-    field: "label",
-    value: "", // 双向绑定的值
-  },
-  {
-    type: "input",
-    label: "套餐ID",
-    field: "id",
-    value: "", // 双向绑定的值
-  },
-  {
-    type: "select",
-    label: "套餐计划类型",
-    field: "isRecharge",
-    options: [], // 默认空,后面会通过字典加载
-    dict: "setMeal",
-    value: "", // 双向绑定的值
-    width: "200",
-  },
-  {
-    type: "range-picker",
-    label: "创建时间",
-    field: "createdAt",
-    value: [], // 双向绑定的值
-    width: "300",
-    Custom: 'mode="month"', // 自定义值
-  },
-  {
-    type: "select",
-    label: "状态",
-    field: "state",
-    options: [
-      { label: '上架', value: '1' },
-      { label: '下架', value: '2' },
-    ], // 默认空,后面会通过字典加载
-    value: "", // 双向绑定的值
-    width: "200",
-  },
-]
-
-export const columnsSetMeal = [
-  {
-    title: "编号",
-    dataIndex: "id",
-    align: "center",
-    ellipsis: true,
-  },
-  {
-    title: "套餐计划名称",
-    dataIndex: "label",
-    align: "center",
-    ellipsis: true,
-  },
-  // {
-  //   title: "所属客户",
-  //   dataIndex: "userName",
-  //   align: "center",
-  //   ellipsis: true,
-  // },
-  {
-    title: "客户名称",
-    dataIndex: "name",
-    align: "center",
-    ellipsis: true,
-  },
-  {
-    title: "客户ID",
-    dataIndex: "userId",
-    align: "center",
-    ellipsis: true,
-  },
-  {
-    title: "运营商名称",
-    dataIndex: "source",
-    align: "center",
-    ellipsis: true,
-  },
-  {
-    title: "套餐计划类型",
-    slotName: "isRechargeName",
-    align: "center",
-    ellipsis: true,
-  },
-  {
-    title: "默认绑定资费",
-    slotName: "defaultTrafficName",
-    align: "center",
-    ellipsis: true,
-  },
-  {
-    title: "状态",
-    slotName: "status",
-    align: "center",
-    ellipsis: true,
-  },
-  {
-    title: "创建时间",
-    dataIndex: "createdAt",
-    align: "center",
-    ellipsis: true,
-  },
-  {
-    title: "更新时间",
-    dataIndex: "updatedAt",
-    align: "center",
-    ellipsis: true,
-  },
-  {
-    title: "操作",
-    align: "center",
-    ellipsis: true,
-    slotName: 'Controls',
-    fixed: 'right'
-  },
-];
-
-
-export const columnsTarrit = [
-  {
-    title: "序号",
-    dataIndex: "index",
-    align: "center",
-    ellipsis: true,
-    render: ({ rowIndex }) => rowIndex + 1,
-  },
-  {
-    title: "套餐名称",
-    dataIndex: "label",
-    align: "center",
-    ellipsis: true,
-  },
-  {
-    title: "所属套餐计划",
-    dataIndex: "terminalName",
-    align: "center",
-    ellipsis: true,
-  },
-  {
-    title: "资费名称",
-    dataIndex: "trafficName",
-    align: "center",
-    ellipsis: true,
-  },
-  {
-    title: "套餐类型",
-    dataIndex: "typeName",
-    align: "center",
-    ellipsis: true,
-  },
-  {
-    title: "充值币种",
-    dataIndex: "currency",
-    align: "center",
-    ellipsis: true,
-  },
-  {
-    title: "原价",
-    dataIndex: "oldPrice",
-    align: "center",
-    ellipsis: true,
-  },
-  {
-    title: "成本",
-    dataIndex: "costPrice",
-    align: "center",
-    ellipsis: true,
-  },
-  {
-    title: "售价(终端充值)",
-    dataIndex: "priceName",
-    align: "center",
-    ellipsis: true,
-  },
-  {
-    title: "利润",
-    dataIndex: "profitPrice",
-    align: "center",
-    ellipsis: true,
-  },
-  {
-    title: "流量成本结算方式",
-    dataIndex: "billingMethod",
-    align: "center",
-    ellipsis: true,
-  },
-  {
-    title: "创建时间",
-    dataIndex: "createdAt",
-    align: "center",
-    ellipsis: true,
-  },
-  {
-    title: "更新时间",
-    dataIndex: "updatedAt",
-    align: "center",
-    ellipsis: true,
-  },
-  {
-    title: "状态",
-    slotName: "status",
-    align: "center",
-    ellipsis: true,
-  },
-  {
-    title: "操作",
-    align: "center",
-    slotName: 'options',
-    fixed: 'right'
-  },
-]
-
-
-// 资费套餐
-export const planColumns = [
-  {
-    title: window.$t("tariffManagement.feeCode"),
-    dataIndex: "feeCode",
-    align: "center",
-    width: 200,
-  },
-  {
-    title: window.$t("tariffManagement.label"),
-    dataIndex: "label",
-    align: "center",
-    width: 200,
-  },
-  {
-    title: window.$t("tariffManagement.source"),
-    dataIndex: "sourceName",
-    align: "center",
-    width: 200,
-  },
-  {
-    title: window.$t("tariffManagement.bagSize"),
-    dataIndex: "bag_size",
-    align: "center",
-    width: 200,
-  },
-];
-
-// 资费搜索字段
-export const trafficSearchFrom = [
-  {
-    type: "input",
-    label: "客户名称",
-    field: "username",
-    value: "", // 双向绑定的值
-  },
-  {
-    type: "input",
-    label: "资费名称",
-    field: "label",
-    value: "", // 双向绑定的值
-  },
-  {
-    type: "select",
-    label: "运应商名称",
-    field: "source",
-    options: [], // 默认空,后面会通过字典加载
-    dict: "source",
-    value: "", // 双向绑定的值
-    width: "200",
-  },
-  {
-    type: "select",
-    label: "流量结算方式",
-    field: "billingMethod",
-    options: [], // 默认空,后面会通过字典加载
-    dict: "billingMethod",
-    value: "", // 双向绑定的值
-    width: "200",
-  },
-  {
-    type: "select",
-    label: "账单账单计费周期",
-    field: "BillingCycle",
-    options: [], // 默认空,后面会通过字典加载
-    dict: "BillingCycle",
-    value: "", // 双向绑定的值
-    width: "200",
-  },
-  {
-    type: "date-picker",
-    label: "有效期",
-    field: "endDate",
-    value: "", // 双向绑定的值
-    width: "200",
-  },
-];
-
-
-export let columnsOperationLog = [
-  {
-    title: window.$t("tariffManagement.id"),
-    dataIndex: "Number",
-    align: "center",
-    width: 200,
-    ellipsis: true,
-  },
-  // { title: window.$t('tariffManagement.feeCode'), dataIndex: 'feeCode', align: 'center', width: 200 },
-  {
-    title: window.$t("tariffManagement.userName"),
-    dataIndex: "userName",
-    align: "center",
-    width: 200,
-    ellipsis: true,
-  },
-  {
-    title: window.$t("tariffManagement.label"),
-    dataIndex: "label",
-    align: "center",
-    width: 200,
-    ellipsis: true,
-  },
-  {
-    title: window.$t("tariffManagement.source"),
-    dataIndex: "sourceName",
-    align: "center",
-    width: 200,
-    ellipsis: true,
-  },
-  {
-    title: window.$t("tariffManagement.simDataPlanIdName"),
-    dataIndex: "metadataPackagesName",
-    align: "center",
-    width: 200,
-    ellipsis: true,
-  },
-  {
-    title: window.$t("tariffManagement.TestFlowPacketName"),
-    dataIndex: "testMetadataPackagesName",
-    align: "center",
-    width: 200,
-    ellipsis: true,
-  },
-  // { title: window.$t('tariffManagement.trafficType'), dataIndex: 'trafficTypeName', align: 'center', width: 200 },
-  // { title: window.$t('tariffManagement.billingType'), dataIndex: 'billingTypeName', align: 'center', width: 200 },
-  {
-    title: window.$t("tariffManagement.billingCycle"),
-    dataIndex: "billingCycleName",
-    align: "center",
-    width: 200,
-    ellipsis: true,
-  },
-  {
-    title: window.$t("tariffManagement.BillingMode"),
-    dataIndex: "billingMethodName",
-    align: "center",
-    width: 200,
-    ellipsis: true,
-  },
-  // { title: window.$t('tariffManagement.bagSize'), dataIndex: 'bagSize', align: 'center', width: 200 },
-  {
-    title: window.$t("tariffManagement.pricing"),
-    dataIndex: "pricingName",
-    align: "center",
-    width: 200,
-    ellipsis: true,
-  },
-  // { title: window.$t('tariffManagement.billingMethod'), dataIndex: 'billing_method', align: 'center', width: 200 },
-  {
-    title: window.$t("tariffManagement.ActivatedNames"),
-    dataIndex: "Activated",
-    align: "center",
-    width: 200,
-    ellipsis: true,
-  },
-  {
-    title: window.$t("tariffManagement.feeStatus"),
-    dataIndex: "status",
-    align: "center",
-    width: 200,
-    ellipsis: true,
-  },
-  {
-    title: window.$t("tariffManagement.MRCName"),
-    dataIndex: "mrcAmount",
-    align: "center",
-    width: 200,
-    ellipsis: true,
-  },
-  {
-    title: window.$t("tariffManagement.networkName"),
-    dataIndex: "networkAccessFee",
-    align: "center",
-    width: 200,
-    ellipsis: true,
-  },
-  {
-    title: window.$t("tariffManagement.endDate"),
-    dataIndex: "endDate",
-    align: "center",
-    width: 200,
-    ellipsis: true,
-  },
-];
-
-// 资费搜索字段
-export const trafficSearchFromOperationLog = [
-  {
-    type: "input",
-    label: "客户名称",
-    field: "username",
-    value: "", // 双向绑定的值
-  },
-  {
-    type: "input",
-    label: "资费名称",
-    field: "label",
-    value: "", // 双向绑定的值
-  },
-  {
-    type: "select",
-    label: "供应商名称",
-    field: "source",
-    options: [], // 默认空,后面会通过字典加载
-    dict: "source",
-    value: "", // 双向绑定的值
-    width: "200",
-  },
-  {
-    type: "select",
-    label: "流量结算方式",
-    field: "billingMethod",
-    options: [], // 默认空,后面会通过字典加载
-    dict: "billingMethod",
-    value: "", // 双向绑定的值
-    width: "200",
-  },
-  {
-    type: "select",
-    label: "账单计费周期",
-    field: "BillingCycle",
-    options: [], // 默认空,后面会通过字典加载
-    dict: "BillingCycle",
-    value: "", // 双向绑定的值
-    width: "200",
-  },
-  {
-    type: "date-picker",
-    label: "有效期",
-    field: "endDate",
-    value: "", // 双向绑定的值
-    width: "200",
-  },
-];

+ 0 - 249
src/views/admin/tariffManagement/index.vue

@@ -1,249 +0,0 @@
-<!-- 资费管理 -->
-<template>
-  <div class="container">
-    <!-- 搜索条件区 -->
-    <div class="search-section">
-      <Search :SearchForm="trafficSearchFrom" @query="initData" @reset="reset" />
-    </div>
-    <div class="audit-btn">
-      <a-button type="text" @click="dictShowModel(1, false)">
-        <template #icon>
-          <icon-plus-circle />
-        </template>
-        <template #default>{{ $t('form.Add') }}</template>
-      </a-button>
-    </div>
-    <a-table row-key="id" :data="tableData" :columns="columns" :pagination="pagination" :scroll="{ x: 'auto' }"
-      @page-change="evChangePage">
-      <template #id="{ record }">
-        <!-- 修改 -->
-        <a class="a-link" href="javascript:;" style="margin-right: 1rem" @click="dictShowModel(2, record)">编辑</a>
-        <!-- 删除 -->
-        <a-popconfirm :content="$t('form.Delete')" :ok-text="$t('form.Confirm')" :cancel-text="$t('form.Cancel')"
-          @ok="handleDel(record.id)">
-          <a class="a-link" href="javascript:;" style="margin-right: 1rem">{{
-            $t('form.Delete')
-          }}</a>
-        </a-popconfirm>
-      </template>
-    </a-table>
-
-
-
-    <a-modal width="70%" :visible="planVisible" :title="$t('tariffManagement.SelectiveTrafficPacket')"
-      @ok="handleSubmitPlan" @cancel="handleCancelTarriName">
-      <!-- 搜索条件区 -->
-      <div class="search-section">
-        <a-form :model="formData" layout="inline">
-          <a-form-item field="label" :label="$t('tariffManagement.label')">
-            <a-input v-model="formData.label" :placeholder="$t('lotCard.please') + $t('tariffManagement.label')"
-              allow-clear />
-          </a-form-item>
-          <a-form-item>
-            <a-space>
-              <a-button type="primary" @click="handleSearchPlan">{{ $t('form.Search') }}</a-button>
-              <a-button @click="resetSearchPlan">{{ $t('form.Reset') }}</a-button>
-            </a-space>
-          </a-form-item>
-        </a-form>
-      </div>
-      <a-table row-key="id" :data="planList" :columns="planColumns" :scroll="{ x: 'auto' }"
-        :row-selection="rowSelectionPlan" v-model:selectedKeys="selectedKeysPlan">
-      </a-table>
-    </a-modal>
-
-
-    <Add v-model:model-value="visible" :type-index="typeCurrent" ref="addDetaile" @submit="initData()"></Add>
-
-  </div>
-</template>
-
-<script setup>
-import { onMounted, ref, toRefs } from "vue";
-import { useRoute } from "vue-router";
-import { columns, planColumns, trafficSearchFrom } from "./config";
-import { deleteTariff, tariffList } from "@/api/path/tariffManagement.api"
-import { Getdictionary, tableFunction, filterDict } from '@/mixins/index.js'
-import Add from './Management/add.vue'
-import Search from '@/components/Search/index.vue'
-import { useI18n } from 'vue-i18n'
-import { Message } from '@arco-design/web-vue'
-
-const { t } = useI18n();
-const state = ref({
-  currency: [],
-  pagination: {
-    total: 0,
-    pageSize: 10,
-    current: 1,
-  },
-  planList: [],
-  visible: false,
-  typeCurrent: null,
-  sourceList: [],
-  cycleist: [],
-  planVisible: false,
-  formData: {},
-  selectedKeysPlan: [],
-  rowSelectionPlan: {
-    type: 'radio',
-    showCheckedAll: true,
-    onlyCurrent: false,
-  },
-  methodList: [],
-  Form: {
-    id: "",
-    name: "",
-  },
-})
-const {
-  currency,
-  pagination,
-  planList,
-  visible,
-  typeCurrent,
-  sourceList,
-  cycleist,
-  planVisible,
-  formData,
-  selectedKeysPlan,
-  rowSelectionPlan,
-  methodList,
-  Form,
-} = toRefs(state.value);
-
-const addDetaile = ref(null)
-
-const processData = (data) => {
-  return (data.records || []).map((item, index) => {
-    delete item.children
-    return {
-      ...item,
-      sourceName: filterDict(sourceList.value, item.source),
-      pricingName: item.billingMethod == 1 ? item.trafficBilling + item.trafficBillingType  +'/'+  item.trafficBillingAmount + item.currency   : item.pricing + item.currency,
-      billingCycleName: filterDict(cycleist.value, item.billingCycle),
-      Activated: item.trafficBilling + item.trafficBillingType,
-      status: "正常",
-      bagSize: item.pricing + '/' + item.mrcAmount + '/' + item.networkAccessFee,
-      billingMethodName: filterDict(methodList.value, item.billingMethod),
-      Number: index + 1
-    }
-  })
-}
-
-const { tableData, evChangePage, initData, reset } = tableFunction(pagination.value, tariffList, processData)
-
-const handleCancelTarriName = () => {
-  putLabel.value = false
-  Form.value.id = ''
-  Form.value.name = ''
-}
-
-// 删除
-const handleDel = async (id) => {
-  const { code } = await deleteTariff({ id })
-  if (code == 200) {
-    Message.success({
-      content: t('setting.deleteSuccess'),
-      duration: 2000,
-    })
-    initData()
-  }
-};
-
-// 弹框
-const dictShowModel = (type, data) => {
-  addDetaile.value.detaile(data)
-  typeCurrent.value = type;
-  visible.value = true;
-}
-
-const resetSearchPlan = () => {
-
-}
-const handleSearchPlan = () => {
-
-}
-
-const handleSubmitPlan = () => {
-  if (selectedKeysPlan.value.length > 0) {
-    formState.value.simDataPlanId = String(selectedKeysPlan.value[0])
-    planVisible.value = false
-  }
-
-}
-
-
-const handleDictValue = async () => {
-  let dict = await Getdictionary(['source', 'Billingcycle', 'currencyType', 'billingMethod'])
-  sourceList.value = dict[0]
-  cycleist.value = dict[1]
-  currency.value = dict[2]
-  methodList.value = dict[3]
-}
-
-
-onMounted(async () => {
-  await handleDictValue()
-  await initData()
-})
-
-
-</script>
-
-<style scoped lang="less">
-.head-title-right {
-  .m-r-10 {
-    margin-right: 10px;
-  }
-
-}
-
-.search-section {
-  margin-top: 20px;
-  margin-bottom: 20px;
-}
-
-.container {
-  .head-title {
-    display: flex;
-    justify-content: space-between;
-  }
-
-  .form-row {
-    display: flex;
-
-    .form-row-col {
-      width: 25%;
-      display: flex;
-      align-items: center;
-
-      .form-row-label {
-        width: 120px;
-        text-align: right;
-      }
-    }
-  }
-}
-
-.audit-btn {
-  margin-bottom: 10px;
-}
-
-.formTitle {
-  font-size: 18px;
-  margin-bottom: 20px;
-  display: flex;
-  align-items: center
-}
-
-.formTitle::before {
-  content: "";
-  display: inline-block;
-  width: 4px;
-  height: 20px;
-  background-color: green;
-  margin-right: 10px;
-
-}
-</style>

+ 0 - 201
src/views/admin/trafficList/NewDataPackageForm.vue

@@ -1,201 +0,0 @@
-<template>
-    <a-modal :visible="visible" :title="localEditMode ? $t('dataPackage.editDataPackage') : $t('dataPackage.addDataPackage')"
-        @ok="handleSubmit" @cancel="handleCancel" :width="720">
-        <a-form :model="formData" ref="formRef">
-            <a-form-item field="source" label="来源" required>
-                <a-select v-model="formData.source" :style="{ width: '320px' }" placeholder="请选择来源">
-                    <a-option v-for="item in optionSource" :value="item.value" :label="item.label" />
-                </a-select>
-            </a-form-item>
-            <a-form-item field="productId" label="流量包ID" required>
-                <a-input v-model="formData.productId" placeholder="请输入" />
-            </a-form-item>
-            <a-form-item field="productName" label="流量包名称" required>
-                <a-input v-model="formData.productName" placeholder="请输入" />
-            </a-form-item>
-            <a-form-item field="dataZoneId" label="地区ID" required>
-                <a-input v-model="formData.dataZoneId" placeholder="请输入" />
-            </a-form-item>
-            <a-form-item field="dataZoneName" label="地区名称" required>
-                <a-input v-model="formData.dataZoneName" placeholder="请输入" />
-            </a-form-item>
-            <a-form-item field="validDays" label="套餐有效天数" required>
-                <a-input v-model="formData.validDays" placeholder="请输入" />
-            </a-form-item>
-            <a-form-item field="dataTotal" label="套餐可用流量" required>
-                <a-input v-model="formData.dataTotal" placeholder="-1表示无限流量 单位MB" />
-            </a-form-item>
-            <a-form-item field="voiceMt" label="语音呼入流量" required>
-                <a-input v-model="formData.voiceMt" placeholder="请输入" />
-            </a-form-item>
-            <a-form-item field="voiceMo" label="语音呼出流量" required>
-                <a-input v-model="formData.voiceMo" placeholder="请输入" />
-            </a-form-item>
-            <a-form-item field="smsTotal" label="短信总条数" required>
-                <a-input v-model="formData.smsTotal" placeholder="请输入" />
-            </a-form-item>
-            <a-form-item field="dataSpeedDefault" label="默认限速" required>
-                <a-input v-model="formData.dataSpeedDefault" placeholder="请输入" />
-            </a-form-item>
-            <a-form-item field="dataQuota" label="单次请求可用流量" required>
-                <a-input v-model="formData.dataQuota" placeholder="请输入" />
-            </a-form-item>
-            <a-form-item field="validDayType" label="有效期" required>
-                <a-select v-model="formData.validDayType" :style="{ width: '320px' }" placeholder="请选择">
-                    <a-option v-for="item in optionsMount" :value="item.value" :label="item.label" />
-                </a-select>
-            </a-form-item>
-            <a-form-item field="rateGroupName" label="费率组名称" required>
-                <a-input v-model="formData.rateGroupName" placeholder="请输入" />
-            </a-form-item>
-            <a-form-item field="zoneVoiceMtName" label="语音呼出地区名称" required>
-                <a-input v-model="formData.zoneVoiceMtName" placeholder="请输入" />
-            </a-form-item>
-            <a-form-item field="zoneVoiceMoName" label="语音呼入地区名称" required>
-                <a-input v-model="formData.zoneVoiceMoName" placeholder="请输入" />
-            </a-form-item>
-            <a-form-item field="zoneDataName" label="流量使用地区名称" required>
-                <a-input v-model="formData.zoneDataName" placeholder="请输入" />
-            </a-form-item>
-            <a-form-item field="zoneSmsName" label="短信使用地区名称" required>
-                <a-input v-model="formData.zoneSmsName" placeholder="请输入" />
-            </a-form-item>
-            <a-form-item field="suppliersId" label="供应商ID" required>
-                <a-input v-model="formData.suppliersId" placeholder="请输入" />
-            </a-form-item>
-        </a-form>
-    </a-modal>
-</template>
-
-<script setup>
-import { ref, reactive, watch, toRefs, onMounted } from 'vue';
-import { useI18n } from 'vue-i18n';
-import { Getdictionary, tableFunction, filterDict } from '@/mixins/index.js'
-import { addFlowPackage, updateFlowPackage } from '@/api/path/system.api'
-import { Message } from '@arco-design/web-vue';
-const { t } = useI18n();
-
-const props = defineProps({
-    visible: Boolean,
-    editMode: Boolean,
-    editData: Object,
-});
-
-const { visible, editMode } = toRefs(props);
-
-const emit = defineEmits(['update:visible', 'submit']);
-const optionsMount = [
-    { value: 1, label: '一个月' },
-    { value: 2, label: '两个月' },
-    { value: 3, label: '三个月' },
-    { value: 4, label: '四个月' },
-    { value: 5, label: '五个月' },
-    { value: 6, label: '六个月' },
-    { value: 7, label: '七个月' },
-    { value: 8, label: '八个月' },
-    { value: 9, label: '九个月' },
-    { value: 10, label: '十个月' },
-    { value: 11, label: '十一个月' },
-    { value: 12, label: '十二个月' }
-]
-const state = ref({
-    optionSource: [],
-})
-
-const { optionSource } = toRefs(state.value)
-
-const formRef = ref(null);
-const formData = reactive({
-    source: null,
-    productId: null,
-    productName: null,
-    dataZoneId: null,
-    dataZoneName: null,
-    validDays: null,
-    voiceMt: null,
-    voiceMo: null,
-    smsTotal: null,
-    dataSpeedDefault: null,
-    dataQuota: null,
-    validDayType: null,
-    rateGroupName: null,
-    zoneVoiceMtName: null,
-    zoneVoiceMoName: null,
-    zoneDataName: null,
-    zoneSmsName: null,
-    suppliersId: 7,
-    dataTotal:null
-});
-
-const localEditMode = ref(props.editMode);
-
-watch(() => formData.source, val => {
-    if (val == 'NEWTECH-Universal')
-        switch (val) {
-            case 'NEWTECH-Universal':
-                formData.suppliersId = 2;
-                break;
-            case 'NEWTECH-CMI':
-                formData.suppliersId = 1;
-                break;
-
-            default:
-                formData.suppliersId = 7
-                break;
-        }
-}, { deep: true })
-
-
-watch(() => props.editData, (newVal) => {
-    if (newVal) {
-        Object.assign(formData, newVal);
-        localEditMode.value = true
-    } else {
-        Object.keys(formData).forEach((key) => {
-            formData[key] = null;
-        });
-        formData.source = optionSource.value[optionSource.value.length - 1].value
-        formData.suppliersId = 7
-        localEditMode.value = false
-    }
-}, { deep: true });
-
-const handleSubmit = () => {
-    formRef.value.validate(async (errors) => {
-        if (!errors) {
-            formData.validDays = Number(formData.validDays)
-            formData.dataTotal = Number(formData.dataTotal)
-            formData.voiceMt = Number(formData.voiceMt)
-            formData.voiceMo = Number(formData.voiceMo)
-            formData.smsTotal = Number(formData.smsTotal)
-            formData.dataSpeedDefault = Number(formData.dataSpeedDefault)
-            formData.dataQuota = Number(formData.dataQuota)
-            formData.validDayType = Number(formData.validDayType)
-            
-            let res = localEditMode.value ? await updateFlowPackage(formData) : await addFlowPackage(formData)
-            if (res.code === 200) {
-                Message.success('添加成功')
-                emit('update:visible', false)
-                emit('submit', true)
-            }
-        } else {
-            console.error('Validation failed', errors);
-        }
-    });
-};
-
-const handleCancel = () => {
-    emit('update:visible', false);
-    Object.keys(formData).forEach(res => {
-        formData[res] = null
-    })
-    formData.source = optionSource.value[optionSource.value.length - 1].value
-    formData.suppliersId = 7
-};
-
-onMounted(async () => {
-    const dict = await Getdictionary(['source'])
-    optionSource.value = dict[0]
-    formData.source = dict[0][dict[0].length - 1].value
-})
-</script>

+ 0 - 88
src/views/admin/trafficList/config.js

@@ -1,88 +0,0 @@
-export const columns = [
-  { title: window.$t('dataPackage.id'), dataIndex: 'id', align: 'center', ellipsis: true },
-  { title: '供应商', dataIndex: 'source', align: 'center', ellipsis: true },
-  { title: '流量包名称', dataIndex: 'productName', align: 'center', ellipsis: true },
-  { title: '地区名称', dataIndex: 'dataZoneName', align: 'center', ellipsis: true },
-  { title: '套餐有效天数', dataIndex: 'validDays', align: 'center', ellipsis: true },
-  { title: '套餐可用流量', dataIndex: 'total', align: 'center', ellipsis: true },
-  { title: '语音呼入流量', dataIndex: 'voiceMt', align: 'center', ellipsis: true},
-  { title: '语音呼出流量', dataIndex: 'voiceMo', align: 'center', ellipsis: true },
-  { title: '短信总条数', dataIndex: 'smsTotal', align: 'center', ellipsis: true },
-  { title: '默认限速', dataIndex: 'dataSpeedDefault', align: 'center', ellipsis: true },
-  { title: '单次请求可用流量', dataIndex: 'dataQuota', align: 'center', ellipsis: true },
-  { title:'有效期类型', dataIndex: 'validDayType', align: 'center', ellipsis: true },
-  { title: '费率组名称', dataIndex: 'rateGroupName', align: 'center', ellipsis: true },
-  { title: '语音呼出地区名称', dataIndex: 'zoneVoiceMtName', align: 'center', ellipsis: true },
-  { title: '语音呼入地区名称', dataIndex: 'zoneVoiceMoName', align: 'center', ellipsis: true },
-  { title: '流量使用地区名称', dataIndex: 'zoneDataName', align: 'center', ellipsis: true },
-  { title: '短信使用地区名称', dataIndex: 'zoneSmsName', align: 'center', ellipsis: true},
-  {
-    title: window.$t('global.common.operations'),
-    slotName: 'options',
-    align: 'center',
-    width: 180,
-    fixed: "right",
-  }
-]
-
-export const SearchFormList = [
-  {
-    type: "select",
-    label: "供应商名称",
-    field: "source",
-    options: [], // 默认空,后面会通过字典加载
-    dict: "source",
-    value: "", // 双向绑定的值
-    width: "200",
-  },
-  {
-    type: "input",
-    label: "流量包名称",
-    field: "name", 
-    value: "", // 双向绑定的值
-  },
-  {
-    type: "input",
-    label: "地区名称",
-    field: "userName", 
-    value: "", // 双向绑定的值
-  },
-  {
-    type: "input",
-    label: "套餐有效天数",
-    field: "userName", 
-    value: "", // 双向绑定的值
-  },
-  {
-    type: "input",
-    label: "默认限速",
-    field: "userName", 
-    value: "", // 双向绑定的值
-  },
-  {
-    type: "input",
-    label: "流量使用地区名称",
-    field: "userName", 
-    value: "", // 双向绑定的值
-  },
-  {
-    type: "input",
-    label: "短信使用地区名称",
-    field: "userName", 
-    value: "", // 双向绑定的值
-  },
-  {
-    type: "input",
-    label: "语音呼出地区名称",
-    field: "userName", 
-    value: "", // 双向绑定的值
-  },
-  {
-    type: "input",
-    label: "语音呼入地区名称",
-    field: "userName", 
-    value: "", // 双向绑定的值
-  }
-]
-
-

+ 0 - 118
src/views/admin/trafficList/index.vue

@@ -1,118 +0,0 @@
-<!-- 流量包管理 -->
-<template>
-  <div class="container">
-    <!-- 搜索条件区 -->
-    <div class="search-section">
-      <Search :SearchForm="SearchFormList" @query="intData" @reset="reset" />
-    </div>
-    <div class="add">
-      <a-button type="primary" @click="Info = false;visible = true">新增流量包</a-button>
-    </div>
-    <a-table :data="dataSource" :columns="columns" :pagination="pagination" :scroll="{ x: 'auto' }"
-      @page-change="evChangePage">
-      <template #options="{ record }">
-        <a-button type="text" @click="EditRecord(record)">编辑</a-button>
-      </template>
-    </a-table>
-
-    <NewDataPackageForm :visible="visible" @submit="intData()" :editData="Info" @update:visible="visible = $event"/>
-  </div>
-</template>
-
-<script setup>
-import { onMounted, ref } from "vue";
-import { useRoute } from "vue-router";
-import { columns, SearchFormList } from "./config";
-import { getDataPlanList } from "@/api/path/lotCard.api"
-import { sanitizeObject } from '@/utils/utils'
-import Search from '@/components/Search/index.vue'
-import NewDataPackageForm from './NewDataPackageForm.vue'
-const searchForm = ref({});
-
-const dataSource = ref([]);
-const pagination = ref({
-  total: 0,
-  pageSize: 10,
-  current: 1,
-})
-const visible = ref(false)
-const Info = ref(false)
-const intData = async (item) => {
-  if (item) {
-    searchForm.value = item
-  }
-  const param = {
-    current: pagination.value.current,
-    pageSize: pagination.value.pageSize,
-    ...searchForm.value,
-  }
-  const { data } = await getDataPlanList(param)
-  dataSource.value = (data?.records || []).map((item, index) => {
-    const total = item.dataTotal == -1 ? '无限流量' : item.dataTotal + "MB"
-    const dataItem = sanitizeObject({ ...item })
-    return {
-      ...dataItem,
-      total: total,
-    }
-  })
-  pagination.value.total = data.total
-}
-
-const reset = (item) => {
-  searchForm.value = item
-  pagination.value.current = 1
-  intData()
-}
-
-
-const evChangePage = (page) => {
-  pagination.value.current = page
-  intData()
-}
-
-const EditRecord = (record) => {
-  Info.value = record
-  visible.value = true
-}
-
-onMounted(() => {
-  intData()
-})
-</script>
-
-<style scoped lang="less">
-.search-section {
-  margin-top: 20px;
-  margin-bottom: 20px;
-}
-
-.container {
-  .head-title {
-    display: flex;
-    justify-content: space-between;
-  }
-
-  .form-row {
-    display: flex;
-
-    .form-row-col {
-      width: 25%;
-      display: flex;
-      align-items: center;
-
-      .form-row-label {
-        width: 120px;
-        text-align: right;
-      }
-    }
-  }
-}
-
-.audit-btn {
-  margin-bottom: 10px;
-}
-
-.add {
-  margin-bottom: 20px;
-}
-</style>

+ 0 - 433
src/views/financialManagement/accountBalance/index.vue

@@ -1,433 +0,0 @@
-<!-- 账户余额-总览界面 -->
-<template>
-  <div class="customer-top-up">
-    <div class="item-box">
-      <div class="item-title">总览</div>
-      <div class="item-grid-box">
-        <div class="grid-item" v-for="(item, index) in cardList" :key="index">
-          <div class="grid-item-title">{{ item.name }}</div>
-          <div class="grid-item-num">
-            <div class="item-num">{{ item.value }}</div>
-            <div class="item-dw">{{ item.unit }}</div>
-          </div>
-        </div>
-      </div>
-    </div>
-    <div class="item-box">
-      <div class="item-title">账单明细</div>
-      <!-- 搜索条件区 -->
-      <div class="search-section">
-        <Search :SearchForm="AccountBalanceSearch" @query="initData" @reset="reset"></Search>
-      </div>
-      <!-- 数据表格 -->
-      <a-table row-key="customerName" :columns="columns" :data="tableData" :pagination="pagination"
-        @page-change="evChangePage">
-        <template #detail="{ record }">
-          <a-button @click="openDetail(record)" type="text">查看</a-button>
-          <a-button @click="openTopsUp(record)" type="text">结算</a-button>
-        </template>
-        <template #status="{ record }">
-          <div v-if="record.status == 1" class="status-table" style="color: rgba(43, 164, 113, 1)">
-            <div class="status-icon" style="background-color: rgba(43, 164, 113, 1)"></div>
-            正常
-          </div>
-          <div v-if="record.status == 0" class="status-table">
-            <div class="status-icon"></div>
-            欠费中
-          </div>
-        </template>
-      </a-table>
-    </div>
-    <a-modal v-model:visible="showAdd" title="结算" @cancel="showAdd = false" @before-ok="submitAdd" okText="确定"
-      width="800px" cancelText="关闭">
-      <a-form :model="formAdd" auto-label-width>
-        <a-form-item field="customerName" label="客户名称">
-          <!-- <a-input v-model="formAdd.customerName" placeholder="请输入客户" /> -->
-          泰国栗
-        </a-form-item>
-        <a-form-item field="money" label="当前帐单应收金额">
-          <!-- <a-input-number v-model="formAdd.money" placeholder="请输入金额" class="input-demo" :min="10"
-                        :max="100" /> -->
-          1242113.00元
-        </a-form-item>
-        <a-form-item field="topsUpOpinion" label="结算金额">
-          <!-- <a-textarea placeholder="请输入" v-model="formAdd.topsUpOpinion" allow-clear /> -->
-          123111.00元
-        </a-form-item>
-        <a-form-item field="fileList" label="打款凭证">
-          <a-upload action="/" :default-file-list="formAdd.fileList" style="width: auto; max-width: 400px" />
-          <div class="text-box">
-            <div class="text">1.请上传客户银行转账等同等性质的支付凭证文件</div>
-            <div class="text">2.图片仅支持jpg或png格式</div>
-            <div class="text">3.图片不得大于2M</div>
-          </div>
-        </a-form-item>
-      </a-form>
-    </a-modal>
-    <a-modal v-model:visible="showDetail" width="1000px" title="订单详情" :hide-cancel="true" @cancel="detailCancel">
-      <div class="detail">
-        <div class="detail-box">
-          <div class="detail-title">账单信息(泰国李总)</div>
-          <div class="detail-item-box">
-            <div class="detail-item">
-              <div class="item-label">订单状态</div>
-              <div class="item-content" style="color: rgba(253, 63, 90, 1)">
-                欠款中
-              </div>
-            </div>
-            <div class="detail-item">
-              <div class="item-label">账单单号</div>
-              <div class="item-content">1223423422435343</div>
-            </div>
-          </div>
-          <div class="detail-item-box">
-            <div class="detail-item">
-              <div class="item-label">订单结算周期</div>
-              <div class="item-content">2024-10-24~2025-10-23</div>
-            </div>
-            <div class="detail-item">
-              <div class="item-label">出账日期</div>
-              <div class="item-content">2024-10-24</div>
-            </div>
-          </div>
-          <div class="detail-item-box">
-            <div class="detail-item">
-              <div class="item-label">结算时间</div>
-              <div class="item-content">2024-10-24</div>
-            </div>
-            <div class="detail-item">
-              <div class="item-label">账单结算金额</div>
-              <div class="item-content">103849美金</div>
-            </div>
-          </div>
-          <div class="detail-title">结算详情</div>
-          <div class="js-detail" v-for="item in 4" :key="item">
-            <div class="detail-item-box">
-              <div class="detail-item">
-                <div class="item-label">运营商</div>
-                <div class="item-content" style="color: rgba(43, 164, 113, 1)">
-                  泰国AIS
-                </div>
-              </div>
-            </div>
-            <div class="detail-item-box">
-              <div class="detail-item">
-                <div class="item-label">套餐流量消耗</div>
-                <div class="item-content">7129.76G</div>
-              </div>
-              <div class="detail-item">
-                <div class="item-label">套餐流量流量结算方式</div>
-                <div class="item-content">按单流量消耗计费</div>
-              </div>
-            </div>
-            <div class="detail-item-box">
-              <div class="detail-item">
-                <div class="item-label">套餐流量价格</div>
-                <div class="item-content">0.65美金/G</div>
-              </div>
-              <div class="detail-item">
-                <div class="item-label">结算周期</div>
-                <div class="item-content">月</div>
-              </div>
-            </div>
-            <div class="detail-item-box">
-              <div class="detail-item">
-                <div class="item-label">叠加流量消耗</div>
-                <div class="item-content">11244G</div>
-              </div>
-              <div class="detail-item">
-                <div class="item-label">叠加流量流量结算方式</div>
-                <div class="item-content">按周期计算</div>
-              </div>
-            </div>
-            <div class="detail-item-box">
-              <div class="detail-item">
-                <div class="item-label">叠加流量价格</div>
-                <div class="item-content">0.8美金/月</div>
-              </div>
-              <div class="detail-item">
-                <div class="item-label">结算周期</div>
-                <div class="item-content">月</div>
-              </div>
-            </div>
-          </div>
-          <div class="detail-title">入账订单列表</div>
-          <div class="detail-table">
-            <a-table :columns="columnsDetail" :data="dataDetail" :pagination="pagination" />
-          </div>
-        </div>
-      </div>
-    </a-modal>
-  </div>
-</template>
-<script setup>
-import { ref, reactive, onMounted } from "vue";
-import { Message } from "@arco-design/web-vue";
-import { getWalletCard, getWalletList } from "@/api/path/finance.js";
-import { useI18n } from 'vue-i18n'
-import Search from '@/components/Search/index.vue'
-import { AccountBalanceSearch } from '../config'
-const { t } = useI18n()
-import { tableFunction, filterDict } from '@/mixins/index.js'
-
-onMounted(() => {
-  initData();
-  getWalletCardFc()
-});
-
-const cardList = ref([
-  { name: "客户消费总金额/人民币", value: 0, unit: "元" },
-  { name: "本月应收金额/人民币", value: 0, unit: "元" },
-  { name: "客户总欠款金额/人民币", value: 0, unit: "元" },
-  { name: "本月消耗流量", value: 0, unit: "G" },
-  { name: "总消耗流量", value: 0, unit: "G" },
-]);
-
-
-const columns = [
-  {
-    title: "序号",
-    dataIndex: "index",
-    align: "center",
-    render: ({ rowIndex }) => rowIndex + 1,
-  },
-  {
-    title: "账单号",
-    dataIndex: "id",
-    ellipsis: true,
-    tooltip: true,
-    align: "center",
-    maxWidth: 150,
-  },
-  {
-    title: "客户名称", dataIndex: "name", align: "center",
-    ellipsis: true,
-  },
-  {
-    title: "账单生成时间", dataIndex: "createdAt", align: "center",
-    ellipsis: true,
-  },
-  {
-    title: "结算周期时间段", dataIndex: "statementTime", align: "center",
-    ellipsis: true,
-  },
-  {
-    title: "结算金额", dataIndex: "amount", align: "center",
-    ellipsis: true,
-  },
-  {
-    title: "消耗流量", dataIndex: "DataVol", align: "center",
-    ellipsis: true,
-  },
-  {
-    title: "状态", slotName: "status", align: "center",
-    ellipsis: true,
-  },
-  // {
-  //   title: "操作", slotName: "detail", align: "center", align: "center",
-  //   ellipsis: true,
-  // },
-];
-const pagination = ref({
-  total: 0,
-  current: 1,
-  pageSize: 10,
-});
-const openTopsUp = () => {
-  showAdd.value = true;
-};
-const showAdd = ref(false);
-const formAdd = reactive({
-  customerName: "",
-  cardType: "",
-  money: "",
-  status: "",
-  topsUpOpinion: "",
-  fileList: [],
-});
-const submitAdd = () => {
-  window.setTimeout(() => {
-    showAdd.value = false;
-  }, 1000);
-};
-
-const showDetail = ref(false);
-const openDetail = () => {
-  showDetail.value = true;
-};
-const detailCancel = () => { };
-
-const getWalletCardFc = async () => {
-  const { data } = await getWalletCard();
-  cardList.value[0].value = data.rechargeAmount;
-  cardList.value[1].value = data.month_recharge_amount;
-  cardList.value[2].value = data.oweAmount;
-  cardList.value[3].value = data.moth_data_usage;
-  cardList.value[4].value = data.dataUsage;
-};
-
-
-
-const processData = (data) => {
-  return (data.records || []).map(res => {
-    return {
-      ...res,
-      DataVol: res.DataVol + 'G'
-    }
-  })
-}
-
-const { tableData, evChangePage, initData, reset } = tableFunction(pagination.value, getWalletList, processData)
-
-
-</script>
-<style scoped lang="less">
-.customer-top-up {
-  padding: 20px;
-
-  .search-section {
-    margin-bottom: 20px;
-  }
-
-  .audit-btn {
-    margin-bottom: 10px;
-  }
-}
-
-.text-box {
-  width: 100%;
-  margin-left: 10px;
-
-  .text {
-    font-family: PingFang SC;
-    font-size: 12px;
-    font-weight: 400;
-    line-height: 19px;
-    color: rgba(153, 153, 153, 1);
-    text-align: left;
-  }
-}
-
-.item-box {
-  margin-bottom: 20px;
-
-  .item-title {
-    font-family: PingFang SC;
-    font-size: 20px;
-    font-weight: 400;
-    line-height: 28px;
-    color: rgba(0, 0, 0, 0.9);
-    margin-bottom: 10px;
-  }
-
-  .item-grid-box {
-    display: grid;
-    grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
-    grid-gap: 20px;
-
-    .grid-item {
-      background: rgba(247, 247, 247, 1);
-      padding: 20px;
-      box-sizing: border-box;
-      border-radius: 6px;
-      box-shadow: 0px 1px 2px 0px rgba(0, 0, 0, 0.1);
-
-      .grid-item-title {
-        font-family: PingFang SC;
-        font-size: 14px;
-        font-weight: 400;
-        line-height: 22px;
-        text-align: left;
-        color: rgba(0, 0, 0, 0.6);
-      }
-
-      .grid-item-num {
-        display: flex;
-        justify-content: space-between;
-        align-items: center;
-        font-family: PingFang SC;
-        font-size: 28px;
-        font-weight: 400;
-        line-height: 36px;
-        color: rgba(0, 0, 0, 0.9);
-
-        .item-num {}
-
-        .item-dw {}
-      }
-    }
-  }
-}
-
-.status-table {
-  display: flex;
-  align-items: center;
-  //styleName: Body/Medium;
-  font-family: PingFang SC;
-  font-size: 14px;
-  font-weight: 400;
-  line-height: 22px;
-  text-align: left;
-  color: rgba(253, 63, 90, 1);
-  justify-content: center;
-
-  .status-icon {
-    width: 6px;
-    height: 6px;
-    border-radius: 50%;
-    margin-right: 5px;
-    background: rgba(253, 63, 90, 1);
-  }
-}
-
-.detail {
-  height: 600px;
-  overflow-y: auto;
-
-  .detail-box {
-    .detail-title {
-      font-family: PingFang SC;
-      font-size: 20px;
-      font-weight: 400;
-      line-height: 28px;
-      text-align: left;
-      color: rgba(0, 0, 0, 0.9);
-      margin-bottom: 20px;
-    }
-
-    .detail-item-box {
-      display: flex;
-      justify-content: space-between;
-      align-items: center;
-      margin-bottom: 20px;
-
-      .detail-item {
-        //styleName: Body/Medium;
-        font-family: PingFang SC;
-        font-size: 14px;
-        font-weight: 400;
-        line-height: 22px;
-        text-align: left;
-        display: flex;
-        align-items: center;
-        min-width: 350px;
-
-        .item-label {
-          color: rgba(0, 0, 0, 0.4);
-          width: 120px;
-          text-align: right;
-          margin-right: 10px;
-        }
-
-        .item-content {
-          color: rgba(51, 51, 51, 1);
-        }
-      }
-    }
-  }
-
-  .detail-table {
-    margin-top: 20px;
-  }
-}
-</style>

+ 0 - 94
src/views/financialManagement/appPuy/index.vue

@@ -1,94 +0,0 @@
-<!-- 客户充值界面 -->
-<template>
-    <div class="customer-top-up">
-        <!-- 搜索条件区 -->
-        <div class="search-section">
-            <Search @query="initData" @reset="reset" :SearchForm="ClientSearchForm"></Search>
-        </div>
-        <!-- 数据表格 -->
-        <a-table row-key="id" :columns="UserAdiroColumns" :data="tableData" :pagination="pagination"
-            @page-change="evChangePage" @page-size-change="onPageSizeChange" :filter-icon-align-left="true">
-            <template #name="{ record }">
-                <div class="boldTxt">{{ record.name }}</div>
-            </template>
-            <template #status="{ record }">
-                <div>{{ handleStatusTxt(record.status) }}</div>
-            </template>
-            <template #puyStatus="{ record }">
-                <a-tag :color="record.payStatus == 'SUCCESS' ? '#00b42a' : ''">{{ record.puyStatus }}</a-tag>
-            </template>
-            <template #image="{ record }">
-                <a-image width="60" height="60" :src="record.certificateImg" :preview-props="{
-                    actionsLayout: ['rotateRight', 'zoomIn', 'zoomOut'],
-                }" style="cursor: pointer;">
-                </a-image>
-            </template>
-        </a-table>
-
-    </div>
-</template>
-<script setup>
-import { ref, reactive, onMounted } from "vue";
-import { getAdiroePuyList } from "@/api/path/finance.js";
-import { columns, handleStatusTxt, statusOptions, UserAdiroColumns, AdminSearchForm, ClientSearchForm } from '../config'
-import Search from '@/components/Search/index.vue'
-import { Getdictionary, tableFunction, filterDict } from '@/mixins/index.js'
-const pagination = ref({
-    showTotal: true,
-    showJumper: true,
-    showPageSize: true,
-    total: 0,
-    current: 1,
-    pageSize: 10,
-});
-
-const onPageSizeChange = (pageSize) => {
-    pagination.value.pageSize = pageSize;
-    pagination.value.current = 1;
-    initData();
-};
-
-
-const processData = async (data) => {
-    let puyType = await Getdictionary('puyType')
-    return (data.records || []).map(res => {
-        res.puyStatus = filterDict(puyType,res.payStatus)
-        return res
-    })
-}
-
-const { tableData, evChangePage, initData, reset } = tableFunction(pagination.value, getAdiroePuyList, processData)
-
-
-onMounted(() => {
-    initData();
-});
-
-</script>
-<style scoped lang="less">
-.customer-top-up {
-    padding: 20px !important;
-
-    .search-section {
-        margin-bottom: 20px;
-    }
-
-    .audit-btn {
-        margin-bottom: 10px;
-    }
-}
-
-.text-box {
-    width: 100%;
-    margin-left: 10px;
-
-    .text {
-        font-family: PingFang SC;
-        font-size: 12px;
-        font-weight: 400;
-        line-height: 19px;
-        color: rgba(153, 153, 153, 1);
-        text-align: left;
-    }
-}
-</style>

+ 0 - 283
src/views/financialManagement/config.js

@@ -1,283 +0,0 @@
-export const columns = [
-  {
-    title: window.$t("financialManagement.orderNumber"),
-    dataIndex: "index",
-    align: "center",
-    render: ({ rowIndex }) => rowIndex + 1,
-    width: 60,
-    ellipsis: true,
-    tooltip: true,
-  },
-  {
-    title: window.$t("financialManagement.customerId"),
-    dataIndex: "id",
-    ellipsis: true,
-    tooltip: true,
-    width: 180,
-    align: "center",
-  },
-  {
-    title: window.$t("financialManagement.customerName"),
-    dataIndex: "name",
-    align: "center",
-    slotName: "name",
-  },
-  {
-    title: window.$t("financialManagement.customerAccount"),
-    dataIndex: "username",
-    align: "center",
-  },
-  {
-    title: window.$t("financialManagement.rechargeAmountTab"),
-    dataIndex: "rechargeAmount",
-    align: "center",
-  },
-  {
-    title: window.$t("financialManagement.availableAmountTab"),
-    dataIndex: "availableAmount",
-    width: 140,
-    align: "center",
-  },
-  {
-    title: window.$t("financialManagement.rechargeType"),
-    dataIndex: "status",
-    align: "center",
-    slotName: "status",
-    filterable: {
-      filters: [
-        {
-          text: window.$t("financialManagement.recharge"),
-          value: "1",
-        },
-        {
-          text: window.$t("financialManagement.offset"),
-          value: "2",
-        },
-        {
-          text: window.$t("financialManagement.deduct"),
-          value: "3",
-        },
-      ],
-      filter: (value, record) => {
-        return record.status === value[0];
-      },
-      multiple: true,
-    },
-  },
-  {
-    title: "凭证",
-    slotName: "image",
-    width: 180,
-    align: "center",
-    ellipsis: true,
-    tooltip: true,
-  },
-  {
-    title: window.$t("financialManagement.updatedAt"),
-    dataIndex: "updatedAt",
-    width: 180,
-    align: "center",
-  },
-];
-
-export const handleStatusTxt = (status) => {
-  const obj = {
-    1: window.$t("financialManagement.recharge"),
-    2: window.$t("financialManagement.offset"),
-    3: window.$t("financialManagement.deduct"),
-  };
-  return obj[status];
-};
-
-export const statusOptions = [
-  { label: window.$t("financialManagement.recharge"), value: "1" },
-  { label: window.$t("financialManagement.offset"), value: "2" },
-  { label: window.$t("financialManagement.deduct"), value: "3" },
-];
-
-// h5充值
-export const UserAdiroColumns = [
-  {
-    title: "ICCID",
-    dataIndex: "iccid",
-    align: "center",
-    width:200
-  },
-  {
-    title: "资费名称",
-    dataIndex: "trafficName",
-    align: "center",
-    ellipsis: true,
-    tooltip: true,
-  },
-  {
-    title: "套餐名称",
-    dataIndex: "productName",
-    align: "center",
-    ellipsis: true,
-    tooltip: true,
-  },
-
-  {
-    title: "订单ID",
-    dataIndex: "orderId",
-    align: "center",
-    ellipsis: true,
-    tooltip: true,
-  },
-  {
-    title: "支付状态",
-    slotName: "puyStatus",
-    align: "center",
-    ellipsis: true,
-    tooltip: true,
-  },
-  {
-    title: "支付渠道",
-    dataIndex: "payChannel",
-    align: "center",
-    ellipsis: true,
-    tooltip: true,
-  },
-  {
-    title: "支付金额",
-    dataIndex: "payAmount",
-    align: "center",
-    ellipsis: true,
-    tooltip: true,
-  },
-  {
-    title: "币种",
-    dataIndex: "currency",
-    align: "center",
-    ellipsis: true,
-    tooltip: true,
-  },
-  {
-    title: "用户手机号",
-    dataIndex: "phone",
-    align: "center",
-    ellipsis: true,
-    tooltip: true,
-  },
-  {
-    title: "充值时间",
-    dataIndex: "createdAt",
-    align: "center",
-    ellipsis: true,
-    tooltip: true,
-  },
-  {
-    title: "备注",
-    dataIndex: "remark",
-    align: "center",
-    ellipsis: true,
-    tooltip: true,
-  },
-];
-// 账户余额搜索
-export const AccountBalanceSearch = [
-  {
-    type: "input",
-    label: "账单号",
-    field: "id",
-    value: "", // 双向绑定的值
-  },
-  {
-    type: "input",
-    label: "客户名称",
-    field: "name",
-    value: "", // 双向绑定的值
-  },
-  {
-    type: "range-picker",
-    label: "账单生成时间",
-    field: "time",
-    value: "", // 双向绑定的值
-  },
-  {
-    type: "range-picker",
-    label: "结算周期时间段",
-    field: "a",
-    value: "", // 双向绑定的值
-  },
-  {
-    type: "select",
-    label: "状态",
-    field: "moderationStatus",
-    options: [], // 默认空,后面会通过字典加载
-    dict: "orderType",
-    value: "", // 双向绑定的值
-    width: "200",
-  },
-];
-// 平台端搜索
-export const AdminSearchForm = [
-  {
-    type: "input",
-    label: "客户账号",
-    field: "id",
-    value: "", // 双向绑定的值
-  },
-  {
-    type: "input",
-    label: "客户名称",
-    field: "id",
-    value: "", // 双向绑定的值
-  }
-]
-
-// 客户端搜索
-export const ClientSearchForm = [
-  {
-    type: "input",
-    label: "ICCID",
-    field: "iccid",
-    value: "", // 双向绑定的值
-  },
-  {
-    type: "input",
-    label: "资费名称",
-    field: "tariffName",
-    value: "", // 双向绑定的值
-  },
-  {
-    type: "input",
-    label: "套餐名称",
-    field: "productName",
-    value: "", // 双向绑定的值
-  },
-  // {
-  //   type: "select",
-  //   label: "运营商名称",
-  //   field: "source",
-  //   options: [], // 默认空,后面会通过字典加载
-  //   dict: "source",
-  //   value: "", // 双向绑定的值
-  //   width: "200",
-  // },
-  {
-    type: "input",
-    label: "订单ID",
-    field: "id",
-    value: "", // 双向绑定的值
-  },
-  {
-    type: "select",
-    label: "支付状态",
-    field: "payStatus",
-    options: [], // 默认空,后面会通过字典加载
-    dict: "puyType",
-    value: "", // 双向绑定的值
-    width: "200",
-  },
-  {
-    type: "select",
-    label: "币种",
-    field: "currency",
-    options: [], // 默认空,后面会通过字典加载
-    dict: "currencyType",
-    value: "", // 双向绑定的值
-    width: "200",
-  }
-]

+ 0 - 214
src/views/financialManagement/customerTopsUp/index.vue

@@ -1,214 +0,0 @@
-<!-- 客户充值界面 -->
-<template>
-  <div class="customer-top-up">
-    <!-- 搜索条件区 -->
-    <div class="search-section">
-      <Search @query="initData" @reset="reset" :SearchForm="AdminSearchForm"></Search>
-    </div>
-    <div class="audit-btn">
-      <a-button @click="openTopsUp" type="text">
-        <template #icon>
-          <icon-plus-circle />
-        </template>
-        <template #default>{{ $t("financialManagement.recharge") }}</template>
-      </a-button>
-    </div>
-    <!-- 数据表格 -->
-    <a-table row-key="id" :columns="columns" :data="tableData" :pagination="pagination" @page-change="evChangePage"
-      @page-size-change="onPageSizeChange" :filter-icon-align-left="true">
-      <template #name="{ record }">
-        <div class="boldTxt">{{ record.name }}</div>
-      </template>
-      <template #status="{ record }">
-        <div>{{ handleStatusTxt(record.status) }}</div>
-      </template>
-      <template #image="{ record }">
-        <a-image width="60" height="60" :src="record.certificateImg" :preview-props="{
-          actionsLayout: ['rotateRight', 'zoomIn', 'zoomOut'],
-        }" style="cursor: pointer;">
-        </a-image>
-      </template>
-    </a-table>
-    <a-modal :visible="showAdd" :title="$t('financialManagement.recharge')" @cancel="showAdd = false" @ok="submitAdd"
-      okText="确定" width="800px" cancelText="关闭" :mask-closable="false" :loading="okLoading" unmount-on-close>
-      <a-form ref="addFormRef" :rules="rules" :model="formAdd" auto-label-width>
-        <a-form-item field="status" :label="$t('financialManagement.rechargeType')">
-          <a-radio-group v-model="formAdd.status" :options="statusOptions" />
-        </a-form-item>
-        <a-form-item field="userId" :label="$t('financialManagement.searchForm.name')">
-          <a-select :options="customerOptions" :style="{ width: '320px' }" :loading="customerLoading"
-            :placeholder="$t('financialManagement.lenovoInput')" @search="customerSearch" :field-names="fieldNames"
-            allow-search allow-clear @change="customerChange" />
-        </a-form-item>
-        <a-form-item field="amount" :label="$t('financialManagement.rechargeAmount')">
-          <a-input-number v-model="formAdd.amount" :placeholder="$t('financialManagement.rechargeAmountPlace')"
-            class="input-demo" :min="10" :max="100" :style="{ width: '320px' }" />
-        </a-form-item>
-        <a-form-item field="remarks" :label="$t('financialManagement.remarks')">
-          <a-textarea :placeholder="$t('financialManagement.remarksPlace')" v-model="formAdd.remarks" allow-clear
-            :style="{ width: '320px' }" />
-        </a-form-item>
-        <a-form-item field="certificateImg" :label="$t('financialManagement.voucher')">
-          <Upload v-model:modelValue="formAdd.certificateImg" :style="{ width: 'auto' }" beforeUpload />
-          <div class="text-box">
-            <div class="text">1.{{ $t("financialManagement.uploadTip1") }}</div>
-            <div class="text">2.{{ $t("financialManagement.uploadTip2") }}</div>
-            <div class="text">3.{{ $t("financialManagement.uploadTip3") }}</div>
-          </div>
-        </a-form-item>
-      </a-form>
-    </a-modal>
-  </div>
-</template>
-<script setup>
-import { ref, reactive, onMounted } from "vue";
-import { Message } from "@arco-design/web-vue";
-import { getTopUpRecordList, getCustomerList, topUpAs, getAdiroePuyList } from "@/api/path/finance.js";
-import Upload from "@/components/upload/index.vue";
-import { columns, handleStatusTxt, statusOptions, UserAdiroColumns, AdminSearchForm, ClientSearchForm } from '../config'
-import Search from '@/components/Search/index.vue'
-import { Getdictionary, tableFunction, filterDict } from '@/mixins/index.js'
-const rules = {
-  status: [
-    {
-      required: true,
-      message: window.$t("financialManagement.rulesa.status"),
-      trigger: "change",
-    },
-  ],
-  userId: [
-    {
-      required: true,
-      message: window.$t("financialManagement.rulesa.userId"),
-      trigger: "change",
-    },
-  ],
-  amount: [
-    {
-      required: true,
-      message: window.$t("financialManagement.rulesa.amount"),
-      trigger: "change",
-    },
-  ],
-};
-
-onMounted(() => {
-  initData();
-});
-
-
-const formRef = ref();
-const pagination = ref({
-  showTotal: true,
-  showJumper: true,
-  showPageSize: true,
-  total: 0,
-  current: 1,
-  pageSize: 10,
-});
-
-const onPageSizeChange = (pageSize) => {
-  pagination.value.pageSize = pageSize;
-  initData();
-};
-
-const handleSearch = () => {
-  pagination.value = { ...initPage };
-  initData();
-};
-
-const resetSearch = () => {
-  formRef.value.resetFields();
-  handleSearch();
-};
-
-// 新增弹窗
-const addFormRef = ref();
-
-const openTopsUp = () => {
-  getCustomerListFc();
-  showAdd.value = true;
-};
-const showAdd = ref(false);
-const formAdd = ref({
-  status: "",
-  userId: "",
-  amount: null,
-  remarks: "",
-  certificateImg: "",
-});
-const okLoading = ref(false);
-const submitAdd = () => {
-  addFormRef.value.validate((err) => {
-    okLoading.value = true;
-    if (!err) {
-      const params = {
-        ...formAdd.value,
-      };
-      topUpAs(params).then((res) => {
-        okLoading.value = false;
-        showAdd.value = false;
-        Message.success("充值成功!");
-        initData();
-      });
-    }
-  });
-};
-
-
-const { tableData, evChangePage, initData, reset } = tableFunction(pagination.value, getTopUpRecordList)
-
-// 客户选择
-const customerOptions = ref([]);
-const customerLoading = ref(false);
-const fieldNames = { value: "id", label: "name" };
-const customerSearch = (value) => {
-  if (value) {
-    customerLoading.value = true;
-    getCustomerListFc(value);
-  } else {
-    getCustomerListFc();
-  }
-};
-const customerChange = (val) => {
-  formAdd.value.userId = val;
-};
-const getCustomerListFc = async (value) => {
-  const param = {
-    current: 1,
-    size: 10,
-    name: value,
-  };
-  const { data } = await getCustomerList(param);
-  customerOptions.value = data?.records || [];
-  customerLoading.value = false;
-};
-
-</script>
-<style scoped lang="less">
-.customer-top-up {
-  padding: 20px !important;
-
-  .search-section {
-    margin-bottom: 20px;
-  }
-
-  .audit-btn {
-    margin-bottom: 10px;
-  }
-}
-
-.text-box {
-  width: 100%;
-  margin-left: 10px;
-
-  .text {
-    font-family: PingFang SC;
-    font-size: 12px;
-    font-weight: 400;
-    line-height: 19px;
-    color: rgba(153, 153, 153, 1);
-    text-align: left;
-  }
-}
-</style>

+ 0 - 295
src/views/financialManagement/trafficDetails/index.vue

@@ -1,295 +0,0 @@
-<!-- 流量明细 客户充值界面 -->
-<template>
-  <div class="customer-top-up">
-    <!-- 搜索条件区 -->
-    <div class="search-section">
-      <a-form ref="formRef" :model="searchForm" layout="inline">
-        <a-form-item field="name" label="客户名称">
-          <a-input
-            v-model="searchForm.name"
-            placeholder="请输入客户名称"
-            allow-clear
-          />
-        </a-form-item>
-        <!-- <a-form-item field="exportTime" label="卡导入时间">
-          <a-range-picker
-            v-model="searchForm.exportTime"
-            style="width: 254px; marginbottom: 20px"
-          />
-        </a-form-item> -->
-        <a-form-item>
-          <a-space>
-            <a-button type="primary" @click="handleSearch">搜索</a-button>
-            <a-button @click="resetSearch">重置</a-button>
-          </a-space>
-        </a-form-item>
-      </a-form>
-    </div>
-    <!-- 数据表格 -->
-    <a-table
-      row-key="userId"
-      :columns="columns"
-      :data="tableData"
-      :pagination="pagination"
-      @page-change="onPageChange"
-      @page-size-change="onPageSizeChange"
-    >
-      <template #dataUsage="{ record }">
-        <div class="boldTxt txtPointer" @click="openDetail(record)">
-          {{ record.dataUsage }}M
-        </div>
-      </template>
-    </a-table>
-    <a-modal
-      v-model:visible="showDetail"
-      title="流量消耗明细"
-      @cancel="showDetail = false"
-      @before-ok="submitDetail"
-      okText="确定"
-      width="1000px"
-      cancelText="关闭"
-    >
-      <a-table
-        row-key="ICCID"
-        :columns="columnsDetail"
-        :data="tableDataDetail"
-        :pagination="paginationDetail"
-        :scroll="{
-          x: '130%',
-          y: '100%',
-        }"
-        @page-change="onDetailPageChange"
-        @page-size-change="onDetailPageSizeChange"
-      >
-        <template #dataUsage="{ record }">
-          <div>{{ record.dataUsage }}M/{{ record.dataTotal }}M</div>
-        </template>
-        <template #userName="{ record }">
-          <div>{{ record.userName }}/{{ record.userId }}</div>
-        </template>
-      </a-table>
-    </a-modal>
-  </div>
-</template>
-<script setup>
-import { ref, reactive, onMounted } from "vue";
-import { Message } from "@arco-design/web-vue";
-import { getSimConsumptionDetailsList, getUserSimInfo } from "@/api/path/finance.js";
-
-onMounted(() => {
-  getSimConsumptionDetailsListFc();
-});
-
-const initPage = {
-  total: 0,
-  current: 1,
-  pageSize: 10,
-};
-
-const formRef = ref();
-const searchForm = ref({
-  name: "",
-});
-
-const columns = [
-  {
-    title: "序号",
-    dataIndex: "index",
-    align: "center",
-    render: ({ rowIndex }) => rowIndex + 1,
-    width: 60,
-  },
-  { title: "客户", dataIndex: "username" },
-  { title: "运营商", dataIndex: "source" },
-  { title: "统计时间", dataIndex: "statisticalTime" },
-  { title: "卡套餐", dataIndex: "cardPackageName" },
-  { title: "已用流量套餐", dataIndex: "dataUsage", slotName: "dataUsage",  },
-//   { title: "已用加油包流量", dataIndex: "dataUsage" },
-  { title: "计算周期", dataIndex: "billingCycle" },
-];
-const columnsDetail = [
-  {
-    title: "序号",
-    dataIndex: "index",
-    align: "center",
-    render: ({ rowIndex }) => rowIndex + 1,
-    width: 60,
-  },
-  { title: "ICCID/MSISDN", dataIndex: "iccid" },
-  { title: "客户", dataIndex: "userName" },
-  { title: "运营商", dataIndex: "source", width: 120, },
-  { title: "统计时间", dataIndex: "updatedAt", width: 180, },
-  { title: "用户名称/编号", dataIndex: "userName", slotName: "userName" },
-  { title: "卡套餐", dataIndex: "productName" },
-  {
-    title: "已用/可用(套餐流量)",
-    dataIndex: "usedData",
-    dataIndex: "dataUsage",
-    slotName: "dataUsage",
-  },
-//   { title: "已用/可用(加油包流量)", dataIndex: "fuelPacketUsed" },
-];
-const tableData = ref([]);
-const tableDataDetail = ref([
-  {
-    ICCID: "1210938748329018",
-    customerName: "泰国李总",
-    operators: "泰国AIS",
-    updateTime: "2024-10-24 08:10:34",
-    userName: "Jay/010211",
-    cardPackages: "100M每月",
-    usedData: "28M/100M",
-    fuelPacketUsed: "28M/30M",
-  },
-  {
-    ICCID: "1210938748329019",
-    customerName: "泰国李总",
-    operators: "泰国AIS",
-    updateTime: "2024-10-24 08:10:34",
-    userName: "Jay/010211",
-    cardPackages: "100M每月",
-    usedData: "28M/100M",
-    fuelPacketUsed: "28M/30M",
-  },
-  {
-    ICCID: "12109387483290110",
-    customerName: "泰国李总",
-    operators: "泰国AIS",
-    updateTime: "2024-10-24 08:10:34",
-    userName: "Jay/010211",
-    cardPackages: "100M每月",
-    usedData: "28M/100M",
-    fuelPacketUsed: "28M/30M",
-  },
-  {
-    ICCID: "12109387483290111",
-    customerName: "泰国李总",
-    operators: "泰国AIS",
-    updateTime: "2024-10-24 08:10:34",
-    userName: "Jay/010211",
-    cardPackages: "100M每月",
-    usedData: "28M/100M",
-    fuelPacketUsed: "28M/30M",
-  },
-  {
-    ICCID: "12109387483290112",
-    customerName: "泰国李总",
-    operators: "泰国AIS",
-    updateTime: "2024-10-24 08:10:34",
-    userName: "Jay/010211",
-    cardPackages: "100M每月",
-    usedData: "28M/100M",
-    fuelPacketUsed: "28M/30M",
-  },
-]);
-const pagination = ref({
-  ...initPage,
-  showTotal: true,
-  showJumper: true,
-  showPageSize: true,
-});
-const paginationDetail = ref({
-  ...initPage,
-  showTotal: true,
-  showJumper: true,
-  showPageSize: true,
-});
-
-const onPageChange = (page) => {
-  pagination.value.current = page;
-  getSimConsumptionDetailsListFc();
-};
-const onPageSizeChange = (pageSize) => {
-  pagination.value.pageSize = pageSize;
-  getSimConsumptionDetailsListFc();
-};
-const onDetailPageChange = (page) => {
-  pagination.value.current = page;
-  getUserSimInfoFc();
-};
-const onDetailPageSizeChange = (pageSize) => {
-  pagination.value.pageSize = pageSize;
-  getUserSimInfoFc();
-};
-
-const handleSearch = () => {
-  pagination.value = { ...initPage };
-  getSimConsumptionDetailsListFc();
-};
-
-const resetSearch = () => {
-  formRef.value.resetFields();
-  handleSearch();
-};
-const showDetail = ref(false);
-const submitDetail = () => {
-  window.setTimeout(() => {
-    showDetail.value = false;
-  }, 1000);
-};
-
-const curUserId = ref(null);
-const openDetail = (record) => {
-  curUserId.value = record.userId;
-  getUserSimInfoFc(() => {
-    showDetail.value = true;
-  });
-};
-
-const getSimConsumptionDetailsListFc = async () => {
-  const param = {
-    current: pagination.value.current,
-    size: pagination.value.pageSize,
-    ...searchForm.value,
-  };
-  const { data } = await getSimConsumptionDetailsList(param);
-  tableData.value = data?.records || [];
-  pagination.value.total = data.total;
-};
-const getUserSimInfoFc = async (cb) => {
-  const param = {
-    current: paginationDetail.value.current,
-    size: paginationDetail.value.pageSize,
-    id: curUserId.value,
-  };
-  const { data } = await getUserSimInfo(param);
-  tableDataDetail.value =
-    data.map((v) => {
-      const obj =
-        v?.dataPackage && v.dataPackage.length > 0 ? v.dataPackage[0] : {};
-      return {
-        ...obj,
-        ...v,
-      };
-    }) || [];
-  paginationDetail.value.total = data.length;
-  cb && cb();
-};
-</script>
-<style scoped lang="less">
-.customer-top-up {
-  padding: 20px !important;
-
-  .search-section {
-    margin-bottom: 20px;
-  }
-
-  .audit-btn {
-    margin-bottom: 10px;
-  }
-}
-
-.text-box {
-  width: 100%;
-  margin-left: 10px;
-
-  .text {
-    font-family: PingFang SC;
-    font-size: 12px;
-    font-weight: 400;
-    line-height: 19px;
-    color: rgba(153, 153, 153, 1);
-    text-align: left;
-  }
-}
-</style>

+ 0 - 428
src/views/home/index.vue

@@ -1,428 +0,0 @@
-<template>
-  <div class="container">
-    <div class="leftModel">
-      <div class="cardModel">
-        <div class="modelTitle">预警总览</div>
-        <div class="early">
-          <div class="earlyCard" v-if="userType == 1">
-            <div class="title">账户预警</div>
-            <div class="item">
-              <div class="txt">预警</div>
-              <div class="val">0</div>
-            </div>
-            <div class="item">
-              <div class="txt">欠费</div>
-              <div class="val">0</div>
-            </div>
-          </div>
-          <div class="earlyCard">
-            <div class="title">卡预警</div>
-            <div class="list">
-              <div class="item">
-                <div class="txt">将达量</div>
-                <div class="val">0</div>
-              </div>
-              <div class="item">
-                <div class="txt">已达量</div>
-                <div class="val">0</div>
-              </div>
-              <div class="item">
-                <div class="txt">将到期</div>
-                <div class="val">0</div>
-              </div>
-              <div class="item">
-                <div class="txt">已到期</div>
-                <div class="val">0</div>
-              </div>
-            </div>
-          </div>
-          <div class="earlyCard">
-            <div class="title">池预警</div>
-            <div class="item">
-              <div class="txt">预警</div>
-              <div class="val">0</div>
-            </div>
-            <div class="item">
-              <div class="txt">达量</div>
-              <div class="val">0</div>
-            </div>
-          </div>
-        </div>
-      </div>
-
-      <div class="cardModel">
-        <div class="modelTitle">物联网卡总览</div>
-        <div class="networkList">
-          <div class="networkCard">
-            <div class="title">本月异常</div>
-            <div class="item">
-              <div class="txt">{{ simInfo.abnormalNextMonth }}</div>
-              <div class="val">张</div>
-            </div>
-          </div>
-          <div class="networkCard">
-            <div class="title">下月到期</div>
-            <div class="item">
-              <div class="txt">{{ simInfo.expiresNextMonth }}</div>
-              <div class="val">张</div>
-            </div>
-          </div>
-          <div class="networkCard">
-            <div class="title">本月超停</div>
-            <div class="item">
-              <div class="txt">{{ simInfo.exceedThisMonthStop }}</div>
-              <div class="val">张</div>
-            </div>
-          </div>
-          <div class="networkCard">
-            <div class="title">本月到期</div>
-            <div class="item">
-              <div class="txt">{{ simInfo.expiresThisMonth }}</div>
-              <div class="val">张</div>
-            </div>
-          </div>
-          <div class="networkCard">
-            <div class="title">上月到期</div>
-            <div class="item">
-              <div class="txt">{{ simInfo.expiredLastMonth }}</div>
-              <div class="val">张</div>
-            </div>
-          </div>
-        </div>
-      </div>
-
-      <div class="cardModel">
-        <div class="modelTitle">客户账户信息汇总</div>
-        <div class="accountList">
-          <div class="item" v-if="userType == 1">
-            <div class="txt">账户余额</div>
-            <div class="val">
-              {{ customerInfo.balance }}
-            </div>
-          </div>
-          <div class="item" v-if="userType == 1">
-            <div class="txt">总客户</div>
-            <div class="val">{{ customerInfo.totalCustomer }}</div>
-          </div>
-          <div class="item">
-            <div class="txt">接入账号</div>
-            <div class="val">{{ customerInfo.totalAccount }}</div>
-          </div>
-          <div class="item">
-            <div class="txt">{{ userType == 1 ? "客户充值" : "已充值" }}</div>
-            <div class="val">{{ customerInfo.totalRecharge }}</div>
-          </div>
-          <div class="item" v-if="userType == 1">
-            <div class="txt">已充值客户</div>
-            <div class="val">{{ customerInfo.totalRechargedCustomer }}</div>
-          </div>
-          <div class="item" v-if="userType == 2">
-            <a-link href="link" :hoverable="false">查看接入密钥</a-link>
-          </div>
-        </div>
-      </div>
-
-      <div class="cardModel">
-        <div class="modelTitle">流量消耗统计</div>
-        <div class="flowList">
-          <div class="flowCard">
-            <div class="title">本月消耗流量</div>
-            <div class="main">
-              <div class="value">{{ trafficInfo.totalTraffic }}</div>
-              <div class="txt">GB</div>
-            </div>
-          </div>
-          <div class="flowCard">
-            <div class="title">本月应付金额/人民币</div>
-            <div class="main">
-              <div class="value">{{ trafficInfo.totalOweAmount }}</div>
-              <div class="txt">GB</div>
-            </div>
-          </div>
-          <div class="flowCard">
-            <div class="title">总消耗流量</div>
-            <div class="main">
-              <div class="value">{{ trafficInfo.totalAllTraffic }}</div>
-              <div class="txt">GB</div>
-            </div>
-          </div>
-          <div class="flowCard">
-            <div class="title">总支付金额/人民币</div>
-            <div class="main">
-              <div class="value">{{ trafficInfo.totalAllOweAmount }}</div>
-              <div class="txt">元</div>
-            </div>
-          </div>
-        </div>
-      </div>
-
-      <div class="cardModel">
-        <div class="modelTitle">用户充值统计</div>
-        <div class="flowList">
-          <div class="flowCard">
-            <div class="title">本月充值订单数</div>
-            <div class="main">
-              <div class="value">{{ rechargeInfo.totalRecharge }}</div>
-              <div class="txt">笔</div>
-            </div>
-          </div>
-          <div class="flowCard">
-            <div class="title">本月充值订单金额</div>
-            <div class="main">
-              <div class="value">{{ rechargeInfo?.totalRechargeAmount[0]?.amount }}</div>
-              <div class="txt">{{ rechargeInfo?.totalRechargeAmount[0]?.currency }}</div>
-            </div>
-          </div>
-          <div class="flowCard">
-            <div class="title">总充值订单数</div>
-            <div class="main">
-              <div class="value">{{ rechargeInfo.totalAllRecharge }}</div>
-              <div class="txt">笔</div>
-            </div>
-          </div>
-          <div class="flowCard">
-            <div class="title">总充值订单金额</div>
-            <div class="main">
-              <div class="value">{{ rechargeInfo?.totalAllRechargeAmount[0]?.amount }}</div>
-              <div class="txt">{{ rechargeInfo?.totalAllRechargeAmount[0]?.currency }}</div>
-            </div>
-          </div>
-        </div>
-      </div>
-
-    </div>
-
-    <div class="rightModel">
-      <div class="cardModel">
-        <div class="modelTitle">生命周期分布图</div>
-      </div>
-    </div>
-  </div>
-</template>
-
-<script setup>
-import { onMounted, ref, toRefs } from 'vue'
-import { getHomeData } from '@/api/path/system.api'
-const state = ref({
-  userType: JSON.parse(localStorage.getItem('user_login_information'))?.userType,
-  customerInfo: {},
-  rechargeInfo: { totalRechargeAmount: [], totalAllRechargeAmount: [] },
-  simInfo: {},
-  trafficInfo: {}
-})
-
-const { userType, customerInfo, rechargeInfo, simInfo, trafficInfo } = toRefs(state.value)
-
-const initData = async () => {
-  let res = await getHomeData()
-
-  if (res.code === 200) {
-    customerInfo.value = res.data.customerInfo
-    rechargeInfo.value = res.data.rechargeInfo
-    simInfo.value = res.data.simInfo
-    trafficInfo.value = res.data.trafficInfo
-    // 数据取整
-    trafficInfo.value.totalTraffic = handleResize(trafficInfo.value.totalTraffic)
-    trafficInfo.value.totalAllTraffic = handleResize(trafficInfo.value.totalAllTraffic)
-  }
-}
-function handleResize(data) {
-  const afterFirstConversion = data / 1024
-  const afterSecondConversion = afterFirstConversion / 1024;
-  const result = Math.ceil(afterSecondConversion * 100) / 100;
-  return result.toFixed(2)
-}
-
-onMounted(() => {
-  initData()
-})
-</script>
-
-<style lang="less" scoped>
-.container {
-  background: transparent !important;
-  padding: 0 !important;
-  display: flex;
-  flex-direction: row !important;
-
-  .leftModel {
-    flex: 1;
-  }
-
-  .rightModel {
-    flex: none;
-    width: 400px;
-    margin-left: 16px;
-  }
-}
-
-.cardModel {
-  background: #fff;
-  border-radius: 4px;
-  box-shadow: 0 2px 4px rgba(0, 0, 0, 0.12), 0 0 6px rgba(0, 0, 0, 0.04);
-  padding: 20px;
-  margin-bottom: 16px;
-
-  .modelTitle {
-    margin-bottom: 12px;
-    font-size: 18px;
-  }
-}
-
-.early {
-  display: flex;
-
-  .earlyCard {
-    background: #f7f7f7;
-    padding: 20px;
-    box-sizing: border-box;
-    border-radius: 6px;
-    box-shadow: 0px 1px 2px 0px rgba(0, 0, 0, 0.1);
-    margin-left: 16px;
-
-    &:first-child {
-      margin-left: 0;
-    }
-
-    &:nth-child(1) {
-      flex: 1.5;
-    }
-
-    &:nth-child(2) {
-      flex: 2;
-    }
-
-    &:nth-child(3) {
-      flex: 1;
-    }
-
-    .title {
-      font-size: 14px;
-      font-weight: 400;
-      line-height: 22px;
-      color: rgba(0, 0, 0, 0.6);
-      margin-bottom: 10px;
-    }
-
-    .item {
-      display: flex;
-      margin-bottom: 8px;
-
-      .txt {
-        margin-right: 10px;
-      }
-
-      .val {
-        color: rgb(@blue_0);
-      }
-    }
-
-    .list {
-      display: flex;
-      flex-wrap: wrap;
-
-      .item {
-        width: 50%;
-      }
-    }
-  }
-}
-
-.networkList {
-  display: flex;
-
-  .networkCard {
-    flex: 1;
-    margin-left: 16px;
-    background: #f7f7f7;
-    padding: 20px;
-    box-sizing: border-box;
-    border-radius: 6px;
-    box-shadow: 0px 1px 2px 0px rgba(0, 0, 0, 0.1);
-
-    &:first-child {
-      margin-left: 0;
-    }
-
-    .title {
-      font-size: 14px;
-      font-weight: 400;
-      line-height: 22px;
-      color: rgba(0, 0, 0, 0.6);
-      margin-bottom: 10px;
-    }
-
-    .item {
-      display: flex;
-
-      .txt {
-        margin-right: 4px;
-      }
-
-      .val {
-        color: #999;
-      }
-    }
-  }
-}
-
-.accountList {
-  display: flex;
-  flex-wrap: wrap;
-
-  .item {
-    flex: 33%;
-    margin-bottom: 10px;
-    display: flex;
-
-    .txt {
-      color: #999;
-      margin-right: 16px;
-      width: 100px;
-    }
-
-    .val {
-      .arco-link {
-        margin: 0 8px;
-      }
-    }
-  }
-}
-
-.flowList {
-  display: flex;
-  flex-wrap: wrap;
-
-  .flowCard {
-    flex: 48%;
-    background: #f7f7f7;
-    padding: 20px;
-    box-sizing: border-box;
-    border-radius: 6px;
-    box-shadow: 0px 1px 2px 0px rgba(0, 0, 0, 0.1);
-    margin-bottom: 16px;
-
-    &:nth-child(2n) {
-      margin-left: 16px;
-    }
-
-    .title {
-      font-size: 14px;
-      font-weight: 400;
-      line-height: 22px;
-      color: rgba(0, 0, 0, 0.6);
-      margin-bottom: 10px;
-    }
-
-    .main {
-      display: flex;
-      justify-content: space-between;
-      font-size: 20px;
-
-      .value {}
-
-      .txt {}
-    }
-  }
-}
-</style>

+ 0 - 117
src/views/login/components/HongKong/index.vue

@@ -1,117 +0,0 @@
-<template>
-  <div class="container">
-    <div class="logo">
-      <div class="logo-text">FlexiStream</div>
-    </div>
-    <div class="content">
-      <div class="content-inner">
-        <LoginForm />
-      </div>
-    </div>
-
-    <div class="edition">
-      FlexiStream版本号:1.1
-    </div>
-  </div>
-</template>
-
-
-<script setup>
-import { onMounted } from "vue"
-import LoginForm from '../../components/HongKong/login-form.vue'
-
-</script>
-
-<style scoped lang="less">
-.edition{
-  position: absolute;
-  bottom: 20px;
-  right: 30px;
-  color:#fff;
-  font-size: 14px;
-}
-.container {
-  height: 100vh;
-  width: 100vw;
-
-  .banner {
-    width: 550px;
-    background: linear-gradient(163.85deg, #1d2129 0%, #00308f 100%);
-  }
-
-  .content {
-    position: relative;
-    display: flex;
-    flex: 1;
-    align-items: center;
-    justify-content: center;
-    padding-bottom: 40px;
-    background-image: url('@/assets/images/login_Bg.jpg');
-    height: 100%;
-    width: 100%;
-    background-repeat: no-repeat;
-    background-position: center center;
-    background-size: cover;
-  }
-
-  .footer {
-    position: absolute;
-    right: 0;
-    bottom: 0;
-    width: 100%;
-  }
-}
-
-.logo {
-  position: fixed;
-  top: 24px;
-  left: 22px;
-  z-index: 1;
-  display: inline-flex;
-  align-items: center;
-
-  &-text {
-    margin-right: 4px;
-    margin-left: 4px;
-    color: @bg_color_6;
-    font-size: 20px;
-  }
-}
-
-.banner {
-  display: flex;
-  align-items: center;
-  justify-content: center;
-}
-
-.carousel {
-  height: 100%;
-
-  &-item {
-    display: flex;
-    flex-direction: column;
-    align-items: center;
-    justify-content: center;
-    height: 100%;
-  }
-
-  &-title {
-    color: @bg_color_6;
-    font-weight: 500;
-    font-size: 20px;
-    line-height: 28px;
-  }
-
-  &-sub-title {
-    margin-top: 8px;
-    color: @text_color_2;
-    font-size: 14px;
-    line-height: 22px;
-  }
-
-  &-image {
-    width: 320px;
-    margin-top: 30px;
-  }
-}
-</style>

+ 0 - 162
src/views/login/components/HongKong/login-form.vue

@@ -1,162 +0,0 @@
-<template>
-  <div class="login-form-wrapper">
-    <div class="item">
-      <div class="login-form-title">FlexiStream</div>
-      <div class="login-form-sub-title">Login to FlexiStream</div>
-
-      <a-form ref="loginForm" :model="formData" class="login-form" @submit-success="handleSubmit">
-        <a-form-item field="username" :rules="[{ required: true, message: '用户名不能为空' }]"
-          :validate-trigger="['change', 'blur']" hide-label>
-          <a-input v-model="formData.username" :placeholder="$t('login.userName')">
-            <template #prefix>
-              <icon-user />
-            </template>
-          </a-input>
-        </a-form-item>
-        <a-form-item field="password" :rules="[{ required: true, message: '密码不能为空' }]"
-          :validate-trigger="['change', 'blur']" hide-label>
-          <a-input-password v-model="formData.password" :placeholder="$t('login.password')" allow-clear>
-            <template #prefix>
-              <icon-lock />
-            </template>
-          </a-input-password>
-        </a-form-item>
-
-
-        <a-space :size="16" direction="vertical">
-          <div class="login-form-password-actions">
-            <a-checkbox v-model="rememberPassword">
-              {{ $t('login.RememberAccountNumber') }}
-            </a-checkbox>
-            <!-- <a-link>忘记密码</a-link> -->
-          </div>
-          <a-button type="primary" html-type="submit" long :loading="formLoading">{{ $t('login.disembark') }}</a-button>
-        </a-space>
-      </a-form>
-    </div>
-  </div>
-</template>
-
-<script setup>
-import { ref, reactive, toRefs, onMounted } from 'vue'
-import { encryptByDES } from "@/utils"
-import { loginApi } from "@/api/path/login.api"
-import { useSystemStore } from "@/store/modules/systemStore"
-import { useRouter } from 'vue-router'
-import { updateRouteByMenu } from '@/router/router.update'
-import { FormLoginUser } from '@/store/modules/Login'
-import { useI18n } from 'vue-i18n'
-const { t } = useI18n();
-const router = useRouter()
-const systemStore = useSystemStore()
-const LoginSet = FormLoginUser()
-const state = ref({
-  formData: {
-    username: '',
-    password: ''
-  },
-  formLoading: false,
-  rememberPassword: false,
-})
-
-const { formData, formLoading, rememberPassword } = toRefs(state.value)
-
-const handleSubmit = async () => {
-  const { data } = await loginApi({
-    username: formData.value.username,
-    password: encryptByDES(formData.value.password)
-  })
-
-  if (rememberPassword.value) {
-    LoginSet.loginYester(formData.value)
-  } else {
-    const nste = localStorage.getItem("USER_KEY_ACCOUT") || false;
-    if (nste) {
-      localStorage.removeItem('USER_KEY_ACCOUT')
-    }
-  }
-
-  systemStore.setStateValue({
-    key: 'token',
-    value: data.token,
-    localStorage: true,
-  })
-  systemStore.setStateValue({
-    key: 'user_login_information',
-    value: JSON.stringify(data.userInfo ? data.userInfo : data),
-    localStorage: true,
-  })
-  systemStore.setStateValue({
-    key: 'role',
-    value: data.userType,
-    localStorage: true,
-  })
-  await updateRouteByMenu(router, systemStore)
-
-
-  router.push({
-    path: "/",
-  })
-}
-
-onMounted(() => {
-  if (LoginSet.loadCredentials()) {
-    formData.value.username = LoginSet.loadCredentials()?.username
-    formData.value.password = LoginSet.loadCredentials()?.password
-  }
-})
-
-
-</script>
-
-<style lang="less" scoped>
-.login-form-wrapper {
-  position: absolute;
-  top: 50%;
-  left: 80%;
-  transform: translate(-50%, -50%);
-  background-color: #fff;
-  width: 550px;
-  height: 500px;
-  border-radius: 16px;
-}
-
-
-
-.item {
-  width: 80%;
-}
-
-.login-form {
-  margin-top: 32px;
-
-  &-wrapper {
-    display: flex;
-    justify-content: center;
-    align-items: center;
-  }
-
-  &-title {
-    color: @text_color_1;
-    font-weight: 500;
-    font-size: 24px;
-    line-height: 32px;
-  }
-
-  &-sub-title {
-    color: @text_color_2;
-    font-size: 16px;
-    line-height: 24px;
-  }
-
-  &-password-actions {
-    display: flex;
-    justify-content: space-between;
-    margin-bottom: 15px;
-  }
-
-  &-register-btn {
-    color: @text_color_3 !important;
-  }
-}
-</style>

+ 0 - 118
src/views/login/components/Thailand/index.vue

@@ -1,118 +0,0 @@
-<template>
-  <div class="container">
-    <div class="logo">
-      <!-- <img alt="logo" :src="carouselItem.image" style="height: 50px; border-radius: 50%" /> -->
-      <div class="logo-text">Easy life Platform</div>
-    </div>
-
-
-    <div class="banner">
-      <div  class="carousel-item">
-        <div class="carousel-title">{{ carouselItem.slogan }}</div>
-        <div class="carousel-sub-title">{{ carouselItem.subSlogan }}</div>
-        <img class="carousel-image" :src="carouselItem.image" />
-      </div>
-    </div>
-
-    <div class="content">
-      <div class="content-inner">
-        <LoginForm />
-      </div>
-    </div>
-  </div>
-</template>
-
-
-<script setup>
-import { onMounted } from "vue"
-import LoginForm from './login-form.vue'
-
-import bannerImage from '@/assets/images/login-banner.png'
-const  carouselItem = {
-  slogan: 'Easy life Platform',
-  subSlogan: 'Technology serves life',
-  image: bannerImage,
-}
-</script>
-
-<style scoped lang="less">
-.container {
-  display: flex;
-  height: 100vh;
-  min-width: 1000px;
-  flex-direction: row;
-  .banner {
-    width: 550px;
-    background: linear-gradient(163.85deg, #1d2129 0%, #00308f 100%);
-  }
-
-  .content {
-    position: relative;
-    display: flex;
-    flex: 1;
-    align-items: center;
-    justify-content: center;
-    padding-bottom: 40px;
-    background: @bg_color_2;
-  }
-
-  .footer {
-    position: absolute;
-    right: 0;
-    bottom: 0;
-    width: 100%;
-  }
-}
-.logo {
-  position: fixed;
-  top: 24px;
-  left: 22px;
-  z-index: 1;
-  display: inline-flex;
-  align-items: center;
-
-  &-text {
-    margin-right: 4px;
-    margin-left: 4px;
-    color: @bg_color_6;
-    font-size: 20px;
-  }
-}
-
-.banner {
-  display: flex;
-  align-items: center;
-  justify-content: center;
-}
-.carousel {
-  height: 100%;
-
-  &-item {
-    display: flex;
-    flex-direction: column;
-    align-items: center;
-    justify-content: center;
-    height: 100%;
-  }
-
-  &-title {
-    color: @bg_color_6;
-    font-weight: 500;
-    font-size: 20px;
-    line-height: 28px;
-  }
-
-  &-sub-title {
-    margin-top: 8px;
-    color: @text_color_2;
-    font-size: 14px;
-    line-height: 22px;
-  }
-
-  &-image {
-    width: 320px;
-    margin-top: 30px;
-  }
-}
-</style>
-

+ 112 - 7
src/views/login/index.vue

@@ -1,13 +1,118 @@
 <template>
-  <LoginHongKeng v-if="EnvTypeNum===1"/>
-  <Thailand v-if="EnvTypeNum===0"/>
+  <div class="container">
+    <div class="logo">
+      <!-- <img alt="logo" :src="carouselItem.image" style="height: 50px; border-radius: 50%" /> -->
+      <div class="logo-text">Easy life Platform</div>
+    </div>
+
+
+    <div class="banner">
+      <div  class="carousel-item">
+        <div class="carousel-title">{{ carouselItem.slogan }}</div>
+        <div class="carousel-sub-title">{{ carouselItem.subSlogan }}</div>
+        <img class="carousel-image" :src="carouselItem.image" />
+      </div>
+    </div>
+
+    <div class="content">
+      <div class="content-inner">
+        <LoginForm />
+      </div>
+    </div>
+  </div>
 </template>
 
-<script setup >
-import LoginHongKeng from './components/HongKong/index.vue'
-import Thailand from './components/Thailand/index.vue'
-import { EnvTypeNum } from '@/settings/designSetting'
+
+<script setup>
+import { onMounted } from "vue"
+import LoginForm from '../../components/Thailand/login-form.vue'
+
+import bannerImage from '@/assets/images/login-banner.png'
+const  carouselItem = {
+  slogan: 'Easy life Platform',
+  subSlogan: 'Technology serves life',
+  image: bannerImage,
+}
 </script>
 
-<style scoped lang='less'>
+<style scoped lang="less">
+.container {
+  display: flex;
+  height: 100vh;
+  min-width: 1000px;
+  flex-direction: row;
+  .banner {
+    width: 550px;
+    background: linear-gradient(163.85deg, #1d2129 0%, #00308f 100%);
+  }
+
+  .content {
+    position: relative;
+    display: flex;
+    flex: 1;
+    align-items: center;
+    justify-content: center;
+    padding-bottom: 40px;
+    background: @bg_color_2;
+  }
+
+  .footer {
+    position: absolute;
+    right: 0;
+    bottom: 0;
+    width: 100%;
+  }
+}
+.logo {
+  position: fixed;
+  top: 24px;
+  left: 22px;
+  z-index: 1;
+  display: inline-flex;
+  align-items: center;
+
+  &-text {
+    margin-right: 4px;
+    margin-left: 4px;
+    color: @bg_color_6;
+    font-size: 20px;
+  }
+}
+
+.banner {
+  display: flex;
+  align-items: center;
+  justify-content: center;
+}
+.carousel {
+  height: 100%;
+
+  &-item {
+    display: flex;
+    flex-direction: column;
+    align-items: center;
+    justify-content: center;
+    height: 100%;
+  }
+
+  &-title {
+    color: @bg_color_6;
+    font-weight: 500;
+    font-size: 20px;
+    line-height: 28px;
+  }
+
+  &-sub-title {
+    margin-top: 8px;
+    color: @text_color_2;
+    font-size: 14px;
+    line-height: 22px;
+  }
+
+  &-image {
+    width: 320px;
+    margin-top: 30px;
+  }
+}
 </style>
+

+ 1 - 1
src/views/login/components/Thailand/login-form.vue → src/views/login/login-form.vue

@@ -104,7 +104,7 @@ const handleSubmit = async () => {
   }
 
   router.push({
-    path: "/",
+    path: "/system-menu",
   })
 }
 

+ 0 - 31
src/views/lotCard/cardList/add.vue

@@ -1,31 +0,0 @@
-<template>
-    <a-modal v-model:visible="modelValue" width="800px" :title="$t('form.Add')" @cancel="cancel" @ok="submitStatus" :okText="$t('form.Confirm')"
-        :cancelText="$t('form.Cancel')">
-    </a-modal>
-</template>
-
-<script setup>
-import { ref, defineProps, toRef, defineEmits,watch} from 'vue';
-import { Message } from '@arco-design/web-vue';
-import {useI18n} from 'vue-i18n'
-const {t} = useI18n();
-const props = defineProps({
-    modelValue: {
-        type: Boolean,
-        default: false
-    },
-})
-const modelValue = toRef(props, 'modelValue')
-const emit = defineEmits(['update:modelValue', 'submit'])
-
-const cancel = ()=>{
-    emit('update:modelValue', false)
-}
-// 确定
-const submitStatus = async () => {
-
-}
-
-</script>
-<style scoped>
-</style>

+ 0 - 378
src/views/lotCard/cardList/config.js

@@ -1,378 +0,0 @@
-export const columns = [
-  {
-    title: window.$t("lotCard.iccid"),
-    dataIndex: "iccid",
-    align: "center",
-    ellipsis: true,
-    maxWidth: 200
-  },
-  {
-    title: window.$t("lotCard.sourcePlan"),
-    dataIndex: "source",
-    align: "center",
-    ellipsis: true,
-  },
-  {
-    title: window.$t("lotCard.userName"),
-    dataIndex: "userName",
-    align: "center",
-    ellipsis: true,
-  },
-  { title: "IMSI", dataIndex: "currentImsi", align: "center", ellipsis: true },
-  {
-    title: window.$t("lotCard.bind"),
-    dataIndex: "currentImsi",
-    align: "center",
-    ellipsis: true,
-  },
-  {
-    title: window.$t("lotCard.SimStatus"),
-    slotName: "iccidStatus",
-    align: "center",
-    ellipsis: true,
-  },
-  {
-    title: window.$t("lotCard.DatapackageStatus"),
-    slotName: "DatapackageStatus",
-    align: "center",
-    ellipsis: true,
-  },
-  {
-    title: window.$t("lotCard.TotalFlow"),
-    dataIndex: "dataUsageTotal",
-    align: "center",
-    ellipsis: true,
-  },
-  {
-    title: window.$t("lotCard.NumberTextMessagesSent"),
-    dataIndex: "smsTotal",
-    align: "center",
-    ellipsis: true,
-  },
-  {
-    title: window.$t("lotCard.validity") + window.$t("lotCard.month"),
-    dataIndex: "expireDay",
-    align: "center",
-    ellipsis: true,
-  },
-  {
-    title: window.$t("lotCard.ClosingDate"),
-    dataIndex: "closeTime",
-    align: "center",
-    ellipsis: true,
-  },
-  {
-    title: "SIM" + window.$t("lotCard.ActivationDate"),
-    dataIndex: "activeTime",
-    align: "center",
-    ellipsis: true,
-  },
-  {
-    title: '套餐计划名称',
-    dataIndex: "simTerminalName",
-    align: "center",
-    ellipsis: true,
-  },
-  {
-    title: '套餐计划类型',
-    dataIndex: "packagePlantype",
-    align: "center",
-    ellipsis: true,
-  },
-  {
-    title: '套餐商品名称',
-    dataIndex: "packageName",
-    align: "center",
-    ellipsis: true,
-  },
-  {
-    title: '资费名称',
-    dataIndex: "tariffName",
-    align: "center",
-    ellipsis: true,
-  },
-  {
-    title: '流量包名称',
-    dataIndex: "productName",
-    align: "center",
-    ellipsis: true,
-  },
-  {
-    title: window.$t("lotCard.EarlyWarningState"),
-    dataIndex: "forewarningStatus",
-    align: "center",
-    width: 200,
-    ellipsis: true,
-  },
-  {
-    title: window.$t("lotCard.PoolName_Number"),
-    dataIndex: "poolName",
-    align: "center",
-    width: 200,
-    ellipsis: true,
-  },
-  {
-    title: window.$t("lotCard.TheExpirationTime"),
-    dataIndex: "periodOfSilence",
-    align: "center",
-    width: 200,
-    ellipsis: true,
-  },
-  {
-    title: window.$t("global.common.operations"),
-    dataIndex: "id",
-    slotName: "id",
-    align: "center",
-    width: 200,
-    fixed: "right",
-  },
-];
-
-export const columnsTrafficUse = [
-  {
-    title: window.$t("lotCard.appName"),
-    dataIndex: "appName",
-    align: "center",
-  },
-  {
-    title: window.$t("lotCard.mcc"),
-    dataIndex: "mcc",
-    align: "center",
-    width: 100,
-  },
-  {
-    title: window.$t("lotCard.qtaconsumption"),
-    dataIndex: "qtaconsumption",
-    align: "center",
-  },
-  { title: window.$t("lotCard.time"), dataIndex: "time", align: "center" },
-];
-
-export const SearchForm = [
-  {
-    type: "input",
-    label: "ICCID",
-    field: "iccid",
-    value: "", // 双向绑定的值
-  },
-  {
-    type: "select",
-    label: "供应商",
-    field: "source",
-    options: [], // 默认空,后面会通过字典加载
-    dict: "source",
-    value: "", // 双向绑定的值
-    width: "200",
-  },
-  {
-    type: "input",
-    label: "客户名称",
-    field: "username",
-    value: "", // 双向绑定的值
-  },
-  {
-    type: "input",
-    label: "IMSI",
-    field: "currentImsi",
-    value: "", // 双向绑定的值
-  },
-  {
-    type: "select",
-    label: "流量包状态",
-    field: "packageStatus",
-    options: [], // 默认空,后面会通过字典加载
-    dict: "packageStatus",
-    value: "", // 双向绑定的值
-    width: "200",
-  },
-  {
-    type: "select",
-    label: "SIM状态",
-    field: "status",
-    options: [], // 默认空,后面会通过字典加载
-    dict: "account",
-    value: "", // 双向绑定的值
-    width: "200",
-  },
-  {
-    type: "date-picker",
-    label: "SIM激活日期",
-    field: "activeTime",
-    options: [], // 默认空,后面会通过字典加载
-    dict: "source",
-    value: "", // 双向绑定的值
-    width: "200",
-  },
-  {
-    type: "date-picker",
-    label: "SIM关闭日期",
-    field: "closeTime",
-    options: [], // 默认空,后面会通过字典加载
-    dict: "source",
-    value: "", // 双向绑定的值
-    width: "200",
-  },
-  {
-    type: "input",
-    label: "IMSI所属供应商名称 ",
-    field: "currentImsiProvider",
-    options: [], // 默认空,后面会通过字典加载
-    dict: "source",
-    value: "", // 双向绑定的值
-    width: "200",
-  },
-];
-
-
-export const columnsCard = [
-  {
-    title: window.$t('lotCard.PackageName'),
-    dataIndex: 'tariffName',
-    align: 'center', ellipsis: true
-  }, {
-    title: '流量包名称',
-    dataIndex: 'productName',
-    align: 'center', ellipsis: true
-  }, {
-    title: window.$t('lotCard.PackageStatus'),
-    dataIndex: 'status',
-    align: 'center', ellipsis: true
-  },
-  {
-    title: window.$t('lotCard.validity') + (window.$t('lotCard.month')),
-    dataIndex: 'validDays',
-    align: 'center', ellipsis: true
-  },
-  {
-    title: window.$t('lotCard.AvailableFlow'),
-    dataIndex: 'dataTotal',
-    align: 'center', ellipsis: true
-  },
-  {
-    title: window.$t('lotCard.Usedflow'),
-    dataIndex: 'dataUsage',
-    align: 'center', ellipsis: true
-  },
-  {
-    title: window.$t('lotCard.TrafficUsedToday'),
-    dataIndex: 'dataToday',
-    align: 'center', ellipsis: true
-  },
-  {
-    title: window.$t('lotCard.ActivationDate'),
-    dataIndex: 'activeTime',
-    align: 'center', ellipsis: true
-  },
-  {
-    title: window.$t('lotCard.DueDate'),
-    dataIndex: 'expiryTime',
-    align: 'center', ellipsis: true
-  },
-]
-
-export const columnsTopup = [
-  {
-    title: window.$t('lotCard.OrderNumber'),
-    dataIndex: 'orderId',
-    ellipsis: true,
-    align: 'center',
-  },
-  {
-    title: window.$t('lotCard.PurchasePackage'),
-    dataIndex: 'productName',
-    ellipsis: true,
-    align: 'center',
-  },
-  {
-    title: window.$t('lotCard.PackagePrice'),
-    dataIndex: 'payAmount',
-    ellipsis: true,
-    align: 'center',
-  },
-  {
-    title: window.$t('lotCard.operator'),
-    dataIndex: 'source',
-    ellipsis: true,
-    align: 'center',
-  },
-  {
-    title: window.$t('lotCard.PaymentStatus'),
-    slotName: 'puyStatus',
-    ellipsis: true,
-    align: 'center',
-  },
-  {
-    title: window.$t('lotCard.OrderDate'),
-    dataIndex: 'createdAt',
-    ellipsis: true,
-    align: 'center',
-  },
-]
-
-export const columnsAmount = [
-  // {
-  //   title: window.$t('lotCard.ID'),
-  //   dataIndex: 'productId',
-  //   align: 'center', ellipsis: true
-  // },
-  // {
-  //   title: 'IMIS',
-  //   dataIndex: 'imsi',
-  //   align: 'center', ellipsis: true
-  // },
-
-  {
-    title: 'ICCID',
-    dataIndex: 'ICCID',
-    align: 'center', ellipsis: true
-  },
-  {
-    title: `${window.$t('lotCard.FlowRate')}(MB)`,
-    dataIndex: 'dataVolTotalKb',
-    align: 'center', ellipsis: true
-  },
-  {
-    title: window.$t('lotCard.CargoAreaCode'),
-    dataIndex: 'mcc',
-    align: 'center', ellipsis: true
-  },
-  {
-    title: window.$t('lotCard.DetailDate'),
-    dataIndex: 'startTime',
-    align: 'center', ellipsis: true
-  },
-]
-
-
-export const columnsOperation = [
-  {
-    title: window.$t('lotCard.settingUser'),
-    dataIndex: 'userId',
-    ellipsis: true,
-    align: 'center',
-  },
-  {
-    title: 'iccid',
-    dataIndex: 'iccid',
-    ellipsis: true,
-    align: 'center',
-  },
-  {
-    title: window.$t('lotCard.source'),
-    dataIndex: 'source',
-    ellipsis: true,
-    align: 'center',
-  },
-  {
-    title: window.$t('lotCard.Controls'),
-    dataIndex: 'operation',
-    ellipsis: true,
-    align: 'center',
-  },
-  {
-    title: window.$t('lotCard.remark'),
-    dataIndex: 'remark',
-    ellipsis: true,
-    align: 'center',
-  },
-]

+ 0 - 186
src/views/lotCard/cardList/index.vue

@@ -1,186 +0,0 @@
-<template>
-  <!-- 卡清单管理 -->
-  <div class="container">
-    <!-- 搜索条件区 -->
-    <div class="search-section">
-      <Search :SearchForm="SearchForm" @query="initData" @reset="reset" />
-    </div>
-
-    <div class="SynchronousData">
-      <div class="title">因运营商的流量消耗数据存在延时,查看实时数据请点击【同步最新流量】按钮 </div>
-      <!-- 同步数据 -->
-      <a-button type="primary" @click="syncData">同步数据</a-button>
-    </div>
-
-    <a-table row-key="iccid" :data="tableData" :columns="columnsData" :pagination="false" :scroll="{ x: 'auto' }"
-      :loading="loading">
-      <template #iccidStatus="{ record }">
-        <a-tag color="#7bc616" v-if="record.iccidStatus == '正常'">{{ record.iccidStatus }}</a-tag>
-        <a-tag v-else>{{ record.iccidStatus }}</a-tag>
-      </template>
-      <template #DatapackageStatus="{ record }">
-        <a-tag color="#7bc616" v-if="record.DatapackageStatus == '已激活'">{{ record.DatapackageStatus }}</a-tag>
-        <a-tag v-else>{{ record.DatapackageStatus }}</a-tag>
-      </template>
-      <template #id="{ record }">
-        <!-- 查看流量消耗 -->
-        <a class="a-link" href="javascript:;" style="margin-right: 1rem" @click="handletrafficUseDialog(record)">详情</a>
-        <!-- 解绑卡和绑定卡 -->
-      </template>
-    </a-table>
-
-    <div class="pagtion">
-      <a-pagination :total="pagination.total" v-model:current="pagination.current" show-total show-jumper show-page-size
-        @change="evChangePage" @page-size-change="pagesChange" />
-    </div>
-    <!-- 查看流量消耗 -->
-    <trafficUseDialog ref="trafficUseDialogRef" @submit="initData()" />
-    <Add v-model="showAdd"></Add>
-
-  </div>
-</template>
-
-<script setup>
-import { onMounted, ref, getCurrentInstance, h } from "vue";
-import { columns, SearchForm } from "./config";
-import { cardInfoList, syncFlowData } from "@/api/path/lotCard.api"
-import trafficUseDialog from "./trafficUseDialog.vue";
-import { Getdictionary, tableFunction ,filterDict} from '@/mixins/index.js'
-import { sanitizeObject } from '@/utils/utils'
-import Add from './add.vue'
-import Search from '@/components/Search/index.vue'
-import { Message } from "@arco-design/web-vue";
-const { proxy } = getCurrentInstance()
-import { useI18n } from 'vue-i18n'
-const { t } = useI18n();
-const statusList = ref([]);
-const serviceList = ref([]);
-const pagination = ref({
-  total: 0,
-  pageSize: 10,
-  current: 1,
-})
-const columnsData = ref([])
-const userType = ref(JSON.parse(localStorage.getItem('user_login_information'))?.userType)
-const showAdd = ref(false)
-const loading = ref(false)
-const trafficUseDialogRef = ref()
-const setMealList = ref([])
-
-const processData = (data) => {
-  return (data.records || []).map((item, index) => {
-    const mergedItem = { ...item, ...item.Info };
-    const sanitizedItem = sanitizeObject(mergedItem);
-    return {
-      ...sanitizedItem,
-      payType: item.payType == 0 ? 'Prepay' : 'Postpay',
-      periodOfSilence: item.periodOfSilence || '---' + '/月',
-      DatapackageStatus: item.dataPackage[0]?.status,
-      dataUsage: item.dataPackage[0]?.dataUsage ? item.dataPackage[0]?.dataUsage + '/MB' : '0' + '/MB',
-      dataTotal: item.dataPackage[0]?.dataTotal ? item.dataPackage[0]?.dataTotal + '/MB' : '0' + '/MB',
-      dataUsageTotal: item.dataUsageTotal ? item.dataUsageTotal + '/MB' : '---',
-      productName: item.dataPackage[0]?.productName,
-      packagePlantype: filterDict(setMealList.value, item.isRecharge)
-    }
-  })
-}
-
-const { tableData, evChangePage, initData, reset } = tableFunction(pagination.value, cardInfoList, processData)
-
-
-// 详情
-const handletrafficUseDialog = (data) => {
-  trafficUseDialogRef.value.open(data)
-}
-
-
-const pagesChange = (size) => {
-  pagination.value.pageSize = size
-  initData()
-}
-
-// 获取字典
-const handleDictValue = async () => {
-  let dict = await Getdictionary(['mainCardStatus', 'activationPackageMethod', 'setMeal'])
-  statusList.value = dict[0]
-  serviceList.value = dict[1]
-  setMealList.value = dict[2]
-}
-
-// 同步数据
-const syncData = async () => {
-  let list = []
-  tableData.value.forEach(item => {
-    list.push(item.iccid,)
-  })
-  loading.value = true
-  let res = await syncFlowData({ iccid: list })
-  if (res.code === 200) {
-    Message.success('同步成功')
-    loading.value = false
-    initData()
-  }
-}
-
-
-onMounted(async () => {
-  await handleDictValue()
-  await initData()
-  if (userType.value != 1) {
-    columnsData.value = columns.filter(res => res.dataIndex !== 'productName'); // 过滤掉不满足条件的项
-  } else {
-    columnsData.value = columns;
-  }
-
-})
-</script>
-
-<style scoped lang="less">
-.pagtion {
-  display: flex;
-  justify-content: flex-end;
-  margin-top: 30px;
-}
-
-.search-section {
-  margin-top: 20px;
-  margin-bottom: 20px;
-}
-
-.SynchronousData {
-  display: flex;
-  justify-content: space-between;
-  margin-bottom: 20px;
-
-  .title {
-    font-size: 16px;
-    color: #d1402f;
-  }
-}
-
-.top-actions {
-  margin-bottom: 20px;
-}
-
-.container {
-  .head-title {
-    display: flex;
-    justify-content: space-between;
-  }
-
-  .form-row {
-    display: flex;
-
-    .form-row-col {
-      width: 25%;
-      display: flex;
-      align-items: center;
-
-      .form-row-label {
-        width: 120px;
-        text-align: right;
-      }
-    }
-  }
-}
-</style>

+ 0 - 415
src/views/lotCard/cardList/trafficUseDialog.vue

@@ -1,415 +0,0 @@
-<template>
-  <a-modal width="80%" :visible="visible" :title="$t('lotCard.CardDetails') + Card_info.iccid" :hide-cancel='true'
-    :okText="$t('form.Confirm')" :cancelText="$t('form.Cancel')" @ok="handleSubmit" @cancel="visible = false" draggable>
-    <!-- 卡片信息 -->
-    <a-row class="grid-demo" :gutter="24">
-      <a-col :span="12">
-        <a-form :model="Card_info" auto-label-width label-align="left" class="toal_Form">
-          <a-row :gutter="10">
-            <a-col :span="12">
-              <a-form-item label="ICCID">
-                {{ Card_info.iccid }}
-              </a-form-item>
-            </a-col>
-
-            <a-col :span="12">
-              <a-form-item label="IMSI">
-                {{ Card_info.currentImsi }}
-              </a-form-item>
-            </a-col>
-            <!-- <a-col :span="12">
-              <a-form-item :label="$t('lotCard.currencyBalance')">
-                {{ Card_info.moneyBalances }}
-              </a-form-item>
-            </a-col> -->
-            <a-col :span="12">
-              <a-form-item :label="$t('lotCard.ActivationDate')">
-                {{ Card_info.activeTime }}
-              </a-form-item>
-            </a-col>
-            <a-col :span="12">
-              <a-form-item :label="$t('lotCard.DueDate')">
-                {{ Card_info.expireTime }}
-              </a-form-item>
-            </a-col>
-            <a-col :span="12">
-              <a-form-item :label="$t('lotCard.validity')">
-                {{ Card_info.expireDay }}
-              </a-form-item>
-            </a-col>
-            <a-col :span="12">
-              <a-form-item :label="$t('lotCard.supplier')">
-                {{ Card_info.source }}
-              </a-form-item>
-            </a-col>
-            <!-- <a-col :span="12">
-              <a-form-item :label="$t('lotCard.UsedpackFlow')">
-                {{ Card_info.source }}
-              </a-form-item>
-            </a-col>
-            <a-col :span="12">
-              <a-form-item :label="$t('lotCard.FuelPackFlowAvailable')">
-                {{ Card_info.source }}
-              </a-form-item>
-            </a-col> -->
-          </a-row>
-        </a-form>
-        <p>{{ $t('lotCard.CurrentPackageInformation') }}</p>
-        <a-form :model="dataPackage" auto-label-width label-align="left">
-          <a-row :gutter="10" wrap>
-            <a-col :span="12">
-              <a-form-item label="资费名称">
-                {{ Card_info?.tariffName }}
-              </a-form-item>
-            </a-col>
-            <a-col :span="12">
-              <a-form-item :label="$t('lotCard.PackageStatus')">
-                {{
-                  dataPackage?.status
-                }}
-              </a-form-item>
-            </a-col>
-            <!-- <a-col :span="12">
-              <a-form-item :label="$t('lotCard.validity')">
-                {{ dataPackage?.validDays }} {{ $t('lotCard.month') }}
-              </a-form-item>
-            </a-col> -->
-            <a-col :span="12">
-              <a-form-item :label="$t('lotCard.WhetherToGive')">
-                {{ dataPackage?.present == 0 ? $t('lotCard.No') : $t('lotCard.Yes') }}
-              </a-form-item>
-            </a-col>
-            <a-col :span="12">
-              <a-form-item :label="$t('lotCard.PackageActivationDate')">
-                {{ dataPackage?.activeTime }}
-              </a-form-item>
-            </a-col>
-            <a-col :span="12">
-              <a-form-item label="流量包过期日期">
-                {{ dataPackage?.expiryTime }}
-              </a-form-item>
-            </a-col>
-            <!-- <a-col :span="12">
-              <a-form-item :label="$t('lotCard.PackageValidDays')">
-                {{ dataPackage?.validDays }}
-              </a-form-item>
-            </a-col> -->
-            <!-- <div class="line"></div>
-            <a-col :span="12">
-              <a-form-item :label="$t('lotCard.PlaAvailableData')">
-                {{ dataPackage?.dataTotal == -1 ? $t('lotCard.UnlimitedFlow') : dataPackage?.dataTotal }}MB
-              </a-form-item>
-            </a-col>
-            <a-col :span="12">
-              <a-form-item :label="$t('lotCard.PlanUsedData')">
-                {{ dataPackage?.dataUsage }}MB
-              </a-form-item>
-            </a-col>
-            <a-col :span="12">
-              <a-form-item :label="$t('lotCard.PackageUseTrafficToday')">
-                {{ dataPackage?.dataToday }}MB
-              </a-form-item>
-            </a-col> -->
-
-          </a-row>
-        </a-form>
-      </a-col>
-      <a-col :span="12">
-        <a-tabs>
-          <a-tab-pane key="1" :title="$t('lotCard.MonthlyConsumption')">
-            <div class="chart" style="width:100%" id="chartContainer" />
-          </a-tab-pane>
-          <a-tab-pane key="2" :title="$t('lotCard.CardPackageInformation')">
-            <a-table :columns="columnsCard" :data="dataCard" :scroll="{ x: 'auto' }" :pagination="false">
-            </a-table>
-          </a-tab-pane>
-          <a-tab-pane key="3" :title="$t('lotCard.EarlyWarningInformation')">
-            Content of Tab Panel 3
-          </a-tab-pane>
-          <a-tab-pane key="4" :title="$t('lotCard.RechargeRecord')">
-            <a-table :columns="columnsTopup" :data="dataTopup" :scroll="{ x: 'auto' }" :pagination="pagination"
-              @page-change="evChangePageCardPuy">
-              <template #puyStatus="{ record }">
-                <a-tag :color="record.payStatus == 'SUCCESS' ? '#00b42a' : ''">{{ record.puyStatus }}</a-tag>
-              </template>
-            </a-table>
-          </a-tab-pane>
-          <a-tab-pane key="5" :title="$t('lotCard.UsageAmount')">
-            <a-table :columns="columnsAmount" :data="dataAmount" :scroll="{ x: 'auto' }"
-              @page-change="handelChangePageAounmt" :pagination="pageDataAounmt" />
-          </a-tab-pane>
-          <a-tab-pane key="6" :title="$t('lotCard.OperationRecord')">
-            <a-table :columns="columnsOperation" :data="dataOperation" :scroll="{ x: 'auto' }"
-              @page-change="evChangePage" :pagination="pageData" />
-          </a-tab-pane>
-        </a-tabs>
-      </a-col>
-    </a-row>
-
-    <template #footer>
-      <div class="footer_button">
-        <!-- <a-button type="primary" status="warning">同步卡信息 V</a-button> -->
-        <a-button type="primary" status="warning" @click="SIMCardService(0)">{{ $t('lotCard.SuspensionService')
-          }}</a-button>
-        <a-button type="primary" status="warning" @click="SIMCardService(1)">{{ $t('lotCard.RestoreService')
-          }}</a-button>
-        <!-- <a-button type="primary" status="warning" @click="SIMCardService(2)">{{ $t('lotCard.CloseCard') }}</a-button> -->
-      </div>
-    </template>
-  </a-modal>
-</template>
-<script setup>
-import { onMounted, ref, h, toRefs } from "vue";
-import { getDataCDR, PauseSIMService, RecoverSIMService, OperationRecord, OffSIMCard, getOrderCard, getFlowData } from '@/api/path/lotCard.api'
-import { Getdictionary, filterDict } from '@/mixins/index'
-import { Message, Modal } from '@arco-design/web-vue'
-// 图表插件
-import * as echarts from "echarts";
-import { useI18n } from 'vue-i18n'
-import { columnsCard, columnsTopup, columnsAmount, columnsOperation } from './config'
-const { t } = useI18n();
-const userType = ref(JSON.parse(localStorage.getItem('user_login_information'))?.userType) // 1平台 2用户
-const emit = defineEmits(['submit']);
-const state = ref({
-  visible: false,
-  Card_info: {},
-  dataPackage: null,
-  dataSource: [],
-  pageData: {
-    total: 0,
-    size: 10,
-    current: 1,
-  },
-  pageDataAounmt: {
-    total: 0,
-    size: 10,
-    current: 1,
-    source: '',
-    iccid: ''
-  },
-  pagination: {
-    total: 0,
-    size: 10,
-    current: 1,
-  },
-  option: {
-    xAxis: {
-      type: 'category',
-      data: [t('lotCard.Jan'), t('lotCard.February'), t('lotCard.March'), t('lotCard.April'), t('lotCard.May'), t('lotCard.June'), t('lotCard.July'), t('lotCard.August'), t('lotCard.September'), t('lotCard.October'), t('lotCard.November'), t('lotCard.December')]
-    },
-    yAxis: {
-      type: 'value'
-    },
-    series: [
-      {
-        data: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
-        type: 'bar',
-      }
-    ],
-    tooltip: {
-      // 触发类型,默认数据触发,可选为:'item' | 'axis'
-      trigger: 'axis',
-      // 坐标轴触发,支持的坐标轴有:'x' | 'y' | 'radius' | 'angle'
-      axisPointer: {
-        type: 'shadow' // 默认为直线,可选为:'line' | 'shadow'
-      },
-      // 自定义的 formatter 函数
-      formatter: function (params) {
-        var res = params[0].name + '使用量' + params[0].value.toFixed(2) + 'KB';
-        return res
-      }
-    },
-  },
-  dataCard: [],
-  dataTopup: [],
-  dataAmount: [],
-  dataOperation: []
-})
-
-const { visible, Card_info, dataPackage, dataSource, pageData, pageDataAounmt, pagination, option, dataCard, dataTopup, dataAmount, dataOperation } = toRefs(state.value)
-
-const open = async (data) => {
-  if (!data) {
-    return
-  }
-  dataSource.value = []
-  Card_info.value = data
-  dataPackage.value = data.dataPackage[0]
-
-  // 卡套餐信息
-  dataCard.value = (data.dataPackage || []).map(val => {
-    return {
-      ...val,
-      dataTotal: val.dataTotal == -1 ? t('lotCard.UnlimitedFlow') : val.dataTotal,
-      tariffName: val.tariffName,
-      dataUsage: val.dataUsage + '/MB',
-      dataTotal: val.dataTotal + '/MB',
-      dataToday: val.dataToday + '/MB',
-    }
-  })
-  pageDataAounmt.value.iccid = data.iccid
-  pageDataAounmt.value.source = data.source
-  await getAountData()
-  await optionsRecordSetting()
-  intData()
-  ICCIDPuyData(data.iccid)
-  visible.value = true
-}
-
-
-const getAountData = async () => {
-  let res = await getFlowData(pageDataAounmt.value)
-  if (res.code == 200) {
-    dataAmount.value = res?.data?.records || []
-  }
-  pageDataAounmt.value.total = res?.data?.total
-}
-
-const handelChangePageAounmt = (e) => {
-  pageDataAounmt.value.current = e
-  getAountData()
-}
-
-const ICCIDPuyData = async (id) => {
-  let res = await getOrderCard({ iccid: id, ...pagination.value })
-  let res1 = await Getdictionary('puyType')
-  dataTopup.value = (res.data.records || []).map(val => {
-    return {
-      ...val,
-      puyStatus: filterDict(res1, val.payStatus),
-      payAmount: val.payAmount + val.currency
-    }
-  })
-
-  pagination.value.total = res.data.total
-}
-
-const evChangePageCardPuy = (e) => {
-  console.log(e);
-  pagination.value.current = e
-  ICCIDPuyData(Card_info.value.iccid)
-}
-
-// 月用量
-const intData = async () => {
-  // 获取当前年份
-  const currentYear = new Date().getFullYear();
-
-  // 获取今年的第一天(2025-01-01)
-  const startDate = `${currentYear}-01-01`;
-
-  // 获取今年的最后一天(2025-12-31)
-  const endDateTime = `${currentYear}-12-31`;
-
-  // 调用你的 getDataCDR 方法
-  let res = await getDataCDR({
-    iccid: Card_info.value.iccid,
-    source: Card_info.value.source,
-    startDate: startDate, // 今年的第一天
-    endDate: endDateTime // 今天的日期
-  });
-
-  option.value.series[0].data = res.data.yAxis
-  initChart()
-}
-
-// SIM卡操作
-const SIMCardService = async (index) => {
-  if (index !== 2) {
-    const Inform = {
-      iccid: Card_info.value.iccid, source: Card_info.value.source
-    }
-    // 暂停SIM卡
-    let res = index == 0 ? await PauseSIMService(Inform) : (index == 1 ? await RecoverSIMService(Inform) : '')
-    if (res.code === 200) {
-      Message.success({
-        content: res.message,
-        duration: 2000,
-      })
-      handleSubmit()
-    }
-  } else {
-    Modal.info({
-      title: '关闭卡',
-      cancelText: '关闭',
-      content: () => {
-        return h('div', { style: 'color:red;text-align: center;font-size:18px' }, '当前操作不可逆,请确定是否关闭当前卡!!')
-      },
-      onOk: async () => {
-        // let res = await OffSIMCard()
-      }
-    });
-  }
-}
-const handleSubmit = () => {
-  emit('submit', true);
-  visible.value = false
-};
-
-
-// 图表
-const initChart = () => {
-  const dom = echarts.init(document.getElementById("chartContainer"));
-  dom.setOption(option.value);
-  window.addEventListener("resize", () => {
-    dom.resize();
-  })
-}
-
-const evChangePage = (e) => {
-  pageData.value.current = e
-  optionsRecordSetting()
-}
-
-// 操作日志
-const optionsRecordSetting = async () => {
-  let res = await OperationRecord({
-    current: pageData.value.current,
-    size: pageData.value.size,
-    iccid: Card_info.value.iccid
-  })
-  let res1 = await Getdictionary('source')
-  dataOperation.value = res.data.records.map(res => {
-    return {
-      ...res,
-      source: res1.filter(item => item.value == res.source)[0]?.label
-    }
-  })
-}
-
-defineExpose({ open })
-
-
-</script>
-
-<style scoped lang="less">
-.toal_Form {
-  padding-bottom: 10px;
-  border-bottom: 1px solid #ccc;
-}
-
-p {
-  font-size: 20px;
-  color: black;
-}
-
-.line {
-  margin: 15px 0;
-  border-bottom: 1px solid #ccc;
-  width: 100%;
-}
-
-.footer_button {
-  display: flex;
-  justify-content: start;
-
-  button {
-    margin-right: 15px;
-  }
-}
-
-.chart {
-  height: 310px;
-  width: 100%;
-}
-</style>

+ 0 - 0
src/views/admin/system/dict/config.js → src/views/system/dict/config.js


+ 0 - 0
src/views/admin/system/dict/index.vue → src/views/system/dict/index.vue


+ 0 - 0
src/views/admin/system/dictionary/DictionaryForm.vue → src/views/system/dictionary/DictionaryForm.vue


+ 0 - 0
src/views/admin/system/dictionary/config.js → src/views/system/dictionary/config.js


+ 0 - 0
src/views/admin/system/dictionary/index.vue → src/views/system/dictionary/index.vue


+ 0 - 0
src/views/admin/system/menu/config.js → src/views/system/menu/config.js


+ 3 - 3
src/views/admin/system/menu/index.vue → src/views/system/menu/index.vue

@@ -85,7 +85,7 @@
             </a-select> -->
 
             <a-select v-model="refData.fromData.url" :options="refData.menuList"
-              :field-names="{ value: 'item', label: 'item' }" placeholder="请选择路由地址" allow-clear />
+              :field-names="{ value: 'item', label: 'item' }" placeholder="请选择路由地址" allow-clear allow-create/>
 
           </a-form-item>
 
@@ -228,11 +228,11 @@ const fnGetFormData = async () => {
     const arr = [];
     // 匹配 views 目录下所有直接的 .vue 文件以及 admin 和 user 子文件夹下的 .vue 文件
     const comp = import.meta.glob([
-        "../../../../views/*.vue", 
+        "../../../../views/**/*.vue", 
         "../../../../views/admin/**/*.vue", 
         "../../../../views/user/**/*.vue"
     ]);
-    console.log(comp);
+    console.log(comp,'11111');
 
     if (comp) {
         for (const key in comp) {

+ 0 - 0
src/views/admin/system/role/config.js → src/views/system/role/config.js


+ 0 - 0
src/views/admin/system/role/index.vue → src/views/system/role/index.vue


+ 0 - 0
src/views/admin/system/role/modalMode.vue → src/views/system/role/modalMode.vue


+ 0 - 0
src/views/admin/system/user/config.js → src/views/system/user/config.js


+ 0 - 0
src/views/admin/system/user/form.vue → src/views/system/user/form.vue


+ 0 - 0
src/views/admin/system/user/index.vue → src/views/system/user/index.vue


Some files were not shown because too many files changed in this diff