Browse Source

Merge branch 'milestone-20260128-日常优化1.0'

master
ZhangYong 3 weeks ago
parent
commit
a8fb991bf9
  1. BIN
      src/assets/images/loadingFaild.png
  2. 14
      src/components/locales/lang/en.js
  3. 14
      src/components/locales/lang/zh-CN.js
  4. 25
      src/router/index.js
  5. 5
      src/util/http.js
  6. 5
      src/utils/getMessage.js
  7. 40
      src/utils/goToCheck.js
  8. 113
      src/views/consume/gold/addCoinConsume.vue
  9. 63
      src/views/home.vue
  10. 138
      src/views/login.vue
  11. 2
      src/views/moneyManage/financialAccount/cashFlow.vue
  12. 20
      src/views/moneyManage/receiveDetail/receiveFinance.vue
  13. 20
      src/views/moneyManage/receiveDetail/receiveManage.vue
  14. 14
      src/views/moneyManage/receiveDetail/receiveService.vue
  15. 8
      src/views/moneyManage/refundDetail/refundHeader.vue
  16. 4
      src/views/moneyManage/refundDetail/refundService.vue
  17. 84
      src/views/recharge/gold/addCoinRecharge.vue

BIN
src/assets/images/loadingFaild.png

After

Width: 200  |  Height: 200  |  Size: 10 KiB

14
src/components/locales/lang/en.js

@ -185,6 +185,8 @@ export default {
// Message Group // Message Group
elmessage: { elmessage: {
// Common // Common
accountEmpty: "Account cannot be empty",
passwordEmpty: "Password cannot be empty",
checkRefundgolds: "Refund gold cannot be empty", checkRefundgolds: "Refund gold cannot be empty",
checkPermanentGold: "Permanent gold cannot be empty", checkPermanentGold: "Permanent gold cannot be empty",
loginSuccess: "Login successful", loginSuccess: "Login successful",
@ -553,6 +555,7 @@ export default {
// Add Form Fields // Add Form Fields
common_add: { common_add: {
orderStatus: "Order Status",
jwcode: "Homily ID", jwcode: "Homily ID",
jwcodePlaceholder: "Enter Homily ID", jwcodePlaceholder: "Enter Homily ID",
originalChinese: "Chinese", originalChinese: "Chinese",
@ -666,10 +669,13 @@ export default {
operationConfirm: "Confirm", operationConfirm: "Confirm",
userInfo: "User Info", userInfo: "User Info",
prompt: "Risk Alert", prompt: "Risk Alert",
promptConsume: "Risk Alert for Consume",
similarRechargeRecords: "Similar recent records detected", similarRechargeRecords: "Similar recent records detected",
similarCosumeRecords: "Similar recent consume records detected",
rechargePermanentGold: "Recharge Perm Coins", rechargePermanentGold: "Recharge Perm Coins",
buy: "Buy", buy: "Buy",
operator: "Operator", operator: "Operator",
orderStatus: "Order Status",
submitter: "Submitter", submitter: "Submitter",
continueOperation: "Continue?", continueOperation: "Continue?",
// Gold Bean // Gold Bean
@ -794,6 +800,10 @@ export default {
unknown: "Unknown", unknown: "Unknown",
// 金币新增充值 // 金币新增充值
addCoinRecharge: "New Recharge", addCoinRecharge: "New Recharge",
waitAudit: "Pending",
refunded: "Refunded",
passed: "Passed",
rejected: "Rejected",
// //
// Pay Methods // Pay Methods
payMethods: { payMethods: {
@ -1018,7 +1028,7 @@ export default {
market: "Region", market: "Region",
registerTime: "Registered at", registerTime: "Registered at",
}, },
orderNeedsReview: "A receipt order requires review",
// orderNeedsReview: "A receipt order requires review",
messageGroups: { messageGroups: {
today: "Today", today: "Today",
yesterday: "Yesterday", yesterday: "Yesterday",
@ -1089,6 +1099,8 @@ export default {
ipay88: "Ipay88", ipay88: "Ipay88",
paymentAsia: "PaymentAsia", paymentAsia: "PaymentAsia",
transfer: "E-Transfer", transfer: "E-Transfer",
paysolution:'paysolution',
stripe2:'Stripe2',
}, },
statusList: { statusList: {
submitted: "Submitted", submitted: "Submitted",

14
src/components/locales/lang/zh-CN.js

@ -185,6 +185,8 @@ export default {
// 提示信息组 // 提示信息组
elmessage: { elmessage: {
// 通用 // 通用
accountEmpty: "账号不能为空",
passwordEmpty: "密码不能为空",
checkRefundgolds: "退款金币总数不能为0", checkRefundgolds: "退款金币总数不能为0",
checkPermanentGold: "永久金币不能为空", checkPermanentGold: "永久金币不能为空",
loginSuccess: "登录成功", loginSuccess: "登录成功",
@ -624,6 +626,7 @@ export default {
receiveArea: "到账地区", receiveArea: "到账地区",
receiveAreaPlaceholder: "请选择到账地区", receiveAreaPlaceholder: "请选择到账地区",
price: "原价", price: "原价",
orderStatus: "订单状态",
goodsNamePlaceholder: "请选择商品", goodsNamePlaceholder: "请选择商品",
使用红包: "使用红包", 使用红包: "使用红包",
不使用红包: "不使用红包", 不使用红包: "不使用红包",
@ -666,9 +669,12 @@ export default {
operationConfirm: "操作确认", operationConfirm: "操作确认",
userInfo: "用户信息", userInfo: "用户信息",
prompt: "重复充值风险提示", prompt: "重复充值风险提示",
promptConsume: "重复消耗风险提示",
similarRechargeRecords: "检测到该用户近期有相似充值记录", similarRechargeRecords: "检测到该用户近期有相似充值记录",
similarCosumeRecords: "检测到该用户近期有相似消耗记录",
rechargePermanentGold: "充值永久金币", rechargePermanentGold: "充值永久金币",
buy: "购买", buy: "购买",
orderStatus:'订单状态',
operator: "操作人", operator: "操作人",
submitter: "提交人", submitter: "提交人",
continueOperation: "是否继续操作?", continueOperation: "是否继续操作?",
@ -794,6 +800,10 @@ export default {
unknown: "未知状态", unknown: "未知状态",
// 金币新增充值 --------------------------------- // 金币新增充值 ---------------------------------
addCoinRecharge: "新增充值", addCoinRecharge: "新增充值",
waitAudit: "待审核",
refunded: "已退款",
passed: "已通过",
rejected: "已驳回",
// 支付方式 // 支付方式
// 添加支付方式 // 添加支付方式
payMethods: { payMethods: {
@ -1029,7 +1039,7 @@ export default {
market: "地区", market: "地区",
registerTime: "注册时间", registerTime: "注册时间",
}, },
orderNeedsReview: "用户有条收款订单需审核",
// orderNeedsReview: "用户有条收款订单需审核",
messageGroups: { messageGroups: {
today: "今天", today: "今天",
yesterday: "昨天", yesterday: "昨天",
@ -1101,6 +1111,8 @@ export default {
ipay88: "Ipay88", ipay88: "Ipay88",
paymentAsia: "PaymentAsia", paymentAsia: "PaymentAsia",
transfer: "E-Transfer", transfer: "E-Transfer",
paysolution:'paysolution',
stripe2:'Stripe2',
}, },
statusList: { statusList: {
submitted: "已提交", submitted: "已提交",

25
src/router/index.js

@ -307,27 +307,27 @@ const routes = [
{ {
path: 'receiveDetail', path: 'receiveDetail',
name: "receiveDetail", name: "receiveDetail",
meta: {permissionId: 74},
meta: {permissionId: 59},
children: [ children: [
// 收款提交 // 收款提交
{ {
path: 'receiveService', path: 'receiveService',
name: "receiveService", name: "receiveService",
component: () => import("../views/moneyManage/receiveDetail/receiveService.vue"), component: () => import("../views/moneyManage/receiveDetail/receiveService.vue"),
meta: {permissionId: 60}
meta: {permissionId: [60, 61, 62, 63, 64, 65, 66]}
}, },
// 收款处理(负责人) // 收款处理(负责人)
{ {
path: 'receiveManager', path: 'receiveManager',
name: "receiveManager", name: "receiveManager",
component: () => import("../views/moneyManage/receiveDetail/receiveManage.vue"), component: () => import("../views/moneyManage/receiveDetail/receiveManage.vue"),
meta: {permissionId: [67, 79]}
meta: {permissionId: [79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90]}
}, },
{//收款处理 {//收款处理
path: 'receiveFinance', path: 'receiveFinance',
name: "receiveFinance", name: "receiveFinance",
component: () => import("../views/moneyManage/receiveDetail/receiveFinance.vue"), component: () => import("../views/moneyManage/receiveDetail/receiveFinance.vue"),
meta: {permissionId: [67, 79]}
meta: {permissionId: [67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78]}
}, },
//总部管理员及财务(移除) //总部管理员及财务(移除)
// { // {
@ -350,28 +350,28 @@ const routes = [
path: 'refundService', path: 'refundService',
name: "refundService", name: "refundService",
component: () => import("../views/moneyManage/refundDetail/refundService.vue"), component: () => import("../views/moneyManage/refundDetail/refundService.vue"),
meta: {permissionId: 99}
meta: {permissionId: [99, 100, 101, 102]}
}, },
// 退款审批 // 退款审批
{ {
path: 'refundFinance', path: 'refundFinance',
name: "refundFinance", name: "refundFinance",
component: () => import("../views/moneyManage/refundDetail/refundFinance.vue"), component: () => import("../views/moneyManage/refundDetail/refundFinance.vue"),
meta: {permissionId: 103}
meta: {permissionId: [103, 104, 105, 106]}
}, },
// 退款审批(负责人) // 退款审批(负责人)
{ {
path: 'refundCharge', path: 'refundCharge',
name: "refundCharge", name: "refundCharge",
component: () => import("../views/moneyManage/refundDetail/refundCharge.vue"), component: () => import("../views/moneyManage/refundDetail/refundCharge.vue"),
meta: {permissionId: 107}
meta: {permissionId: [107, 108, 109, 110]}
}, },
// 退款审批(总部财务) // 退款审批(总部财务)
{ {
path: 'refundHeader', path: 'refundHeader',
name: "refundHeader", name: "refundHeader",
component: () => import("../views/moneyManage/refundDetail/refundHeader.vue"), component: () => import("../views/moneyManage/refundDetail/refundHeader.vue"),
meta: {permissionId: 111}
meta: {permissionId: [111, 112, 113, 114]}
}, },
] ]
}, },
@ -380,7 +380,7 @@ const routes = [
path: 'executor', path: 'executor',
name: "executor", name: "executor",
component: () => import("../views/moneyManage/executor/executor.vue"), component: () => import("../views/moneyManage/executor/executor.vue"),
meta: {permissionId: 115}
meta: {permissionId: [115, 116, 117, 118]}
}, },
// 财务核算 // 财务核算
{ {
@ -579,9 +579,10 @@ router.afterEach(async (to) => { // 接收to参数获取当前路由信息
// 存入全局状态,供所有页面访问 // 存入全局状态,供所有页面访问
const messageStore = useMessageStore(); const messageStore = useMessageStore();
// 过滤 flag=1的消息 // 过滤 flag=1的消息
newMessageRes.data = newMessageRes.data.filter(item => item.flag !== 1);
messageStore.setMessages(newMessageRes.data);
const list = Array.isArray(newMessageRes.data)
? newMessageRes.data
: (Array.isArray(newMessageRes.data?.list) ? newMessageRes.data.list : []);
messageStore.setMessages(list.filter(item => item.flag !== 1));
} catch (error) { } catch (error) {
console.error('获取消息失败:', error); console.error('获取消息失败:', error);
} }

5
src/util/http.js

@ -1,14 +1,15 @@
import request from './request' import request from './request'
export default function(options) { export default function(options) {
const { method = 'post', url, data = {}, params = {}, headers = {} } = options
const { method = 'post', url, data = {}, params = {}, headers = {}, responseType } = options
return request({ return request({
method, method,
url, url,
data, data,
params, params,
headers
headers,
responseType
}) })
.then(({ status, data, statusText }) => { .then(({ status, data, statusText }) => {
if (status === 200) { if (status === 200) {

5
src/utils/getMessage.js

@ -15,7 +15,10 @@ function formatTime(timeStr) {
// 函数逻辑不变... // 函数逻辑不变...
const now = new Date(); const now = new Date();
const msgTime = new Date(timeStr); const msgTime = new Date(timeStr);
const diffMs = now - msgTime;
let diffMs = now - msgTime;
if (diffMs < 0) {
diffMs = 0
}
const diffMins = Math.floor(diffMs / (1000 * 60)); const diffMins = Math.floor(diffMs / (1000 * 60));
const diffHours = Math.floor(diffMins / 60); const diffHours = Math.floor(diffMins / 60);
const diffDays = Math.floor(diffHours / 24); const diffDays = Math.floor(diffHours / 24);

40
src/utils/goToCheck.js

@ -34,3 +34,43 @@ export function getOrderPage(status) {
// 未知状态返回工作台 // 未知状态返回工作台
return '/workbench'; return '/workbench';
} }
function toNumberOrNull(value) {
if (value === null || value === undefined) return null;
const num = typeof value === 'number' ? value : Number(String(value).trim());
return Number.isFinite(num) ? num : null;
}
const queryIdRouteNameMap = {
6: 'rechargeAudit',
7: 'rechargeAudit',
8: 'rechargeAudit',
9: 'rechargeAudit',
10: 'rechargeAudit',
11: 'rechargeAudit',
12: 'rechargeAudit',
13: 'refundAudit',
14: 'refundAudit',
15: 'refundAudit',
16: 'refundAudit',
17: 'refundAudit',
18: 'refundAudit',
19: 'refundAudit'
};
export function getMessageJumpTarget(message) {
const permissionId = toNumberOrNull(message?.queryId ?? message?.menuId ?? message?.permissionId);
if (permissionId !== null) {
const routeName = queryIdRouteNameMap[permissionId];
if (routeName) return { name: routeName };
}
const type = toNumberOrNull(message?.type);
if (type === 0) return { name: 'rechargeAudit' };
if (type === 1) return { name: 'refundAudit' };
const status = toNumberOrNull(message?.status);
if (status !== null) return getOrderPage(status);
return '/workbench';
}

113
src/views/consume/gold/addCoinConsume.vue

@ -264,11 +264,12 @@ function calculateCoins(sumGold) {
// cookie key // cookie key
const WriteCookies = ref(null) const WriteCookies = ref(null)
// cookie value // cookie value
const WriteCookiesTime = ref(null)
const WriteCookiesVale = ref({})
// cookie key // cookie key
const ReadCookies = ref(null) const ReadCookies = ref(null)
// cookie value // cookie value
const ReadCookiesTime = ref(null)
const ReadCookiesValue = ref({})
const orderStatus = ref('')
// //
@ -298,7 +299,7 @@ const add = async function () {
freeGold: addConsume.value.freeGold * 100, freeGold: addConsume.value.freeGold * 100,
taskGold: addConsume.value.taskGold * 100, taskGold: addConsume.value.taskGold * 100,
permanentGold: addConsume.value.permanentGold * 100, permanentGold: addConsume.value.permanentGold * 100,
goodsName: addConsume.value.goodsName.value,
goodsName: addConsume.value.goodsName?.value || addConsume.value.goodsName,
remark: addConsume.value.remark, remark: addConsume.value.remark,
adminName: adminData.value.adminName, adminName: adminData.value.adminName,
redMoney: Number(addConsume.value.redMoney), // 1-使0-使 redMoney: Number(addConsume.value.redMoney), // 1-使0-使
@ -322,16 +323,15 @@ const add = async function () {
function handleResponse(result) { function handleResponse(result) {
console.log("响应结果", result) console.log("响应结果", result)
if (result.code === 200) { if (result.code === 200) {
// jwcode
// jwcode:permanentGold:freeGold
WriteCookies.value = `coinConsume:${addConsume.value.jwcode}:${addConsume.value.goodsName.value}`
//value
WriteCookiesTime.value = dayjs().format("YYYY-MM-DD HH:mm:ss");
// cookies,jwcodekeyvaluejwcode1
Cookies.set(WriteCookies.value, WriteCookiesTime.value, {
expires:
1, path: '/'
});
const goodsNameStr = addConsume.value.goodsName?.value || addConsume.value.goodsName
WriteCookies.value = `coinConsume-${addConsume.value.jwcode}-${goodsNameStr}`
//value
console.log("goodsNameStr add", goodsNameStr)
WriteCookiesVale.value = JSON.stringify({
payTime: moment(result.data.createTime).format("YYYY-MM-DD HH:mm:ss"),
orderCode: result.data.orderCoder,
});
Cookies.set(WriteCookies.value, WriteCookiesVale.value, {expires: 1, path: '/'});
ElMessage.success(t('elmessage.addSuccess')); ElMessage.success(t('elmessage.addSuccess'));
console.log("请求成功", result); console.log("请求成功", result);
} else { } else {
@ -448,6 +448,26 @@ const FirstConsumeDialogVisibleCancel = () => {
// }); // });
// }; // };
const historyOrder = ref({})
//
const selectByOrderCode = async function (data) {
try {
const result = await request({
url: '/recharge/selectByOrderCode',
data: data,
headers: {
'Content-Type': 'text/plain;charset=utf-8'
},
})
if(result.code == 200){
historyOrder.value = result.data
}
} catch (error) {
console.log('请求失败', error)
//
}
}
// //
const addBefore = () => { const addBefore = () => {
Ref.value.validate(async (valid) => { Ref.value.validate(async (valid) => {
@ -462,16 +482,28 @@ const addBefore = () => {
if (!validateInput() || !validateRedLimit()) { if (!validateInput() || !validateRedLimit()) {
return; return;
} }
ReadCookies.value = `coinConsume:${addConsume.value.jwcode}:${addConsume.value.goodsName.value}`
ReadCookies.value = `coinConsume-${addConsume.value.jwcode}-${addConsume.value.goodsName.value}`
console.log('ReadCookies',ReadCookies.value);
// cookie // cookie
const cookie = Cookies.get(ReadCookies.value)
console.log("time", WriteCookiesTime.value)
//
ReadCookiesTime.value = moment(cookie).format('YYYY-MM-DD HH:mm:ss')
console.log("cookie========", cookie)
if (cookie) {
const cookieValue = Cookies.get(ReadCookies.value);
if (cookieValue) {
//
const rechargeInfo = JSON.parse(cookieValue);
console.log('提交时间:', rechargeInfo.payTime);
console.log('订单号:', rechargeInfo.orderCode);
ReadCookiesValue.value = {
...rechargeInfo,
}
}else{
ReadCookiesValue.value = {}
}
console.log('ReadCookies',ReadCookiesValue.value);
if (Object.keys(ReadCookiesValue.value).length > 0) {
await selectByOrderCode(ReadCookiesValue.value.orderCode)
orderStatus.value = historyOrder.value.isRefundDesc
ReadCookiesValue.value.goodsName = historyOrder.value.goodsName
ConsumeDialogVisible.value = true; ConsumeDialogVisible.value = true;
} else {
} else {
FirstConsumeDialogVisible.value = true; FirstConsumeDialogVisible.value = true;
} }
}); });
@ -606,16 +638,26 @@ watch(
); );
// //
watch(
() => addConsume.value.goodsName,
(newGoods) => {
if (newGoods && typeof newGoods === 'object') {
addConsume.value.price = Number(newGoods.price || 0) || null;
} else {
addConsume.value.price = null;
}
const handleGoodsChange = (val) => {
// val
if (val) {
addConsume.value.price = Number(val.price || 0) || null;
} else {
addConsume.value.price = null;
} }
);
}
//
// watch(
// () => addConsume.value.goodsName,
// (newGoods) => {
// if (newGoods && typeof newGoods === 'object') {
// addConsume.value.price = Number(newGoods.price || 0) || null;
// } else {
// addConsume.value.price = null;
// }
// }
// );
/* /*
====================红包逻辑================================= ====================红包逻辑=================================
@ -744,9 +786,8 @@ onMounted(async function () {
<el-form-item prop="goodsName" :label="t('common_add.goodsName')"> <el-form-item prop="goodsName" :label="t('common_add.goodsName')">
<el-select v-model="addConsume.goodsName" :placeholder="t('common_add.goodsNamePlaceholder')" <el-select v-model="addConsume.goodsName" :placeholder="t('common_add.goodsNamePlaceholder')"
style="width: 200px" clearable filterable>
<el-option v-for="(item, index) in goods" :key="index" :label="item.label" :value="item" />
style="width: 200px" clearable filterable @change="handleGoodsChange" value-key="id">
<el-option v-for="(item, index) in goods" :key="item.id" :label="item.label" :value="item" />
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item prop="price" :label="t('common_add.price')"> <el-form-item prop="price" :label="t('common_add.price')">
@ -1006,13 +1047,13 @@ onMounted(async function () {
<el-icon :size="24" color="#FFD700"> <el-icon :size="24" color="#FFD700">
<WarnTriangleFilled /> <WarnTriangleFilled />
</el-icon> </el-icon>
<p>{{ $t('common_add.prompt') }}</p>
<p>{{ $t('common_add.promptConsume') }}</p>
</div> </div>
<!-- 记录 + 虚线分隔 --> <!-- 记录 + 虚线分隔 -->
<div> <div>
<el-divider border-style="dashed" /> <el-divider border-style="dashed" />
<p>{{ $t('common_add.similarRechargeRecords') }}</p>
· {{ ReadCookiesTime }} {{ $t('common_add.buy') }} {{ addConsume.goodsName.value }}({{
<p>{{ $t('common_add.similarCosumeRecords') }}</p>
· {{ ReadCookiesValue.payTime }} {{ $t('common_add.buy') }} {{ ReadCookiesValue.goodsName }}{{ $t('common_add.orderStatus') }}: {{ orderStatus }}({{
$t('common_add.operator') }}: {{ adminData.adminName }}) $t('common_add.operator') }}: {{ adminData.adminName }})
</div> </div>
<div style="margin-top: 10px"> <div style="margin-top: 10px">

63
src/views/home.vue

@ -19,6 +19,7 @@ import {findMenuById,permissionMapping} from "@/utils/menuTreePermission.js"
import {useMessageStore} from '@/store/index.js' import {useMessageStore} from '@/store/index.js'
// //
import { useI18n } from 'vue-i18n' import { useI18n } from 'vue-i18n'
import { has } from 'lodash'
const {t} = useI18n(); const {t} = useI18n();
// ------------------ ICONS ------------------ // ------------------ ICONS ------------------
@ -158,15 +159,19 @@ const selectStatusById = () => {
status.push(0); status.push(0);
} }
//
if (hasPermission(permissionMapping.area_finance_collection_approved)) {
status.push(1);
}
//
if (hasPermission(permissionMapping.area_manager_collection_approved)) {
status.push(7);
}
// //
if (hasPermission(permissionMapping.collection_area_submit)) { if (hasPermission(permissionMapping.collection_area_submit)) {
status.push(2); status.push(2);
} }
//
// else if (hasPermission(permissionMapping.area_manager_collection_pending)) {
// status.push(0);
// }
// ===== 退 ===== // ===== 退 =====
// 退 // 退
@ -211,7 +216,8 @@ const getMessage = async () => {
}); });
if (res?.data) { if (res?.data) {
const cleanList = res.data.filter(i => i.flag !== 1)
const list = Array.isArray(res.data) ? res.data : (Array.isArray(res.data?.list) ? res.data.list : [])
const cleanList = list.filter(i => i.flag !== 1)
messageStore.setMessages(cleanList) messageStore.setMessages(cleanList)
} }
} catch (e) { } catch (e) {
@ -282,6 +288,27 @@ const toggleShowAll = () => showAll.value = !showAll.value
const scrollContainer = ref(null) const scrollContainer = ref(null)
const scrollToTop = () => scrollContainer.value?.scrollTo({top: 0, behavior: 'smooth'}) const scrollToTop = () => scrollContainer.value?.scrollTo({top: 0, behavior: 'smooth'})
const getPathByQueryId = (queryId) => {
const qid = Number(queryId)
if (!Number.isFinite(qid)) return null
const matchedRoutes = router.getRoutes().filter(r => {
const pid = r.meta?.permissionId
if (Array.isArray(pid)) return pid.includes(qid)
return pid === qid
})
if (!matchedRoutes.length) return null
matchedRoutes.sort((a, b) => {
const aDepth = typeof a.path === 'string' ? a.path.split('/').length : 0
const bDepth = typeof b.path === 'string' ? b.path.split('/').length : 0
return bDepth - aDepth
})
return matchedRoutes[0]?.path || null
}
// + // +
const handleMessageClick = async (item) => { const handleMessageClick = async (item) => {
const res = await API({ const res = await API({
@ -292,7 +319,22 @@ const handleMessageClick = async (item) => {
if (res.code === 200) { if (res.code === 200) {
closeMessageDialog() closeMessageDialog()
await router.push(getOrderPage(item.status))
const targetPath = item?.queryId ? getPathByQueryId(item.queryId) : null
const messageStatus = Number(item?.status)
// 17
let tab = null
if (messageStatus === 1 && targetPath?.includes('/moneyManage/receiveDetail/receiveFinance')) {
tab = 'pass'
} else if (messageStatus === 7 && targetPath?.includes('/moneyManage/receiveDetail/receiveManager')) {
tab = 'pass'
}
if (targetPath && tab) {
await router.push({ path: targetPath, query: { tab } })
} else {
await router.push(targetPath || getOrderPage(item.status) || '/noPermission')
}
await getMessage() await getMessage()
ElMessage.success(t('elmessage.jumpSuccess')) ElMessage.success(t('elmessage.jumpSuccess'))
} else { } else {
@ -456,7 +498,7 @@ onMounted(() => getMessage())
</el-dialog> </el-dialog>
<!--消息推送的弹窗--> <!--消息推送的弹窗-->
<el-dialog style="background: #F3FAFE" v-model="showMessageDialog" title="" width="500px">
<el-dialog style="background: #F3FAFE" v-model="showMessageDialog" title="" width="550px">
<div class="message-title"> <div class="message-title">
<el-divider <el-divider
class="divider" class="divider"
@ -503,8 +545,9 @@ onMounted(() => getMessage())
</div> </div>
<div class="message-desc"> <div class="message-desc">
<div v-if="findMenuById(menuTree, permissionMapping.refund_headquarters_finance)">[{{ item.marketName }}] </div>
<div>[{{item.name}}{{ item.jwcode }}]{{ t('home.orderNeedsReview') }}</div>
<div v-if="findMenuById(menuTree, permissionMapping.refund_headquarters_finance)">[{{ item.marketName }}]
</div>
<div>[{{item.name}}{{ item.jwcode }}]{{ item.desc}}</div>
</div> </div>
<el-button <el-button
type="primary" type="primary"

138
src/views/login.vue

@ -1,5 +1,5 @@
<script setup> <script setup>
import {onMounted, ref} from 'vue'
import {onMounted, ref,onUnmounted} from 'vue'
import {ElMessage} from 'element-plus' import {ElMessage} from 'element-plus'
import request from '@/util/http' import request from '@/util/http'
import {useRouter} from 'vue-router' import {useRouter} from 'vue-router'
@ -34,7 +34,78 @@ function getMachineId() {
} }
} }
const form = ref({account: null, password: '', token: '', machineId: machineId1.value})
const form = ref({account: null, password: '', token: '', machineId: machineId1.value, captcha: '', uuid: ''})
const formRef = ref(null)
const rules = {
account: [
{ required: true, message: '请输入账号', trigger: 'blur' }
],
password: [
{ required: true, message: '请输入密码', trigger: 'blur' }
],
captcha: [
{ required: true, message: '请输入验证码', trigger: 'blur' }
]
}
const captchaUrl = ref('')
const isCaptchaCooldown = ref(false)
let captchaCooldownTimer = null
let cooldownStartTime = 0 //
const COOLDOWN_TOTAL = 5 * 1000 // 5
//
const startCaptchaCooldown = () => {
isCaptchaCooldown.value = true
cooldownStartTime = Date.now()
captchaCooldownTimer = setTimeout(() => {
isCaptchaCooldown.value = false //
cooldownStartTime = 0 //
}, COOLDOWN_TOTAL)
}
const getCaptchaRemainingSeconds = () => {
if (!isCaptchaCooldown.value || cooldownStartTime === 0) {
return 0
}
const elapsed = Date.now() - cooldownStartTime
const remainingMs = Math.max(COOLDOWN_TOTAL - elapsed, 0)
const remainingSeconds = Math.ceil(remainingMs / 1000)
return remainingSeconds
}
const clearCaptchaCooldown = () => {
if (captchaCooldownTimer) {
clearTimeout(captchaCooldownTimer)
captchaCooldownTimer = null
}
isCaptchaCooldown.value = false
cooldownStartTime = 0
}
//
const getCaptcha = async () => {
if (isCaptchaCooldown.value) {
ElMessage.warning('验证码获取太频繁,请' + getCaptchaRemainingSeconds() + '秒后再试')
return
}
try {
let uuid = Date.now()
localStorage.setItem('uuid', uuid)
const res = await request({
url: '/captcha' + '?uuid=' + uuid,
method: 'get',
responseType: 'blob',
})
if (captchaUrl.value) {
URL.revokeObjectURL(captchaUrl.value);
}
captchaUrl.value = URL.createObjectURL(res);
startCaptchaCooldown()
} catch (error) {
console.error('获取验证码失败', error)
}
}
const adminRoleId = ref(null) const adminRoleId = ref(null)
@ -42,6 +113,12 @@ const adminRoleId = ref(null)
const adminStore = useAdminStore() const adminStore = useAdminStore()
// //
const login = async function () { const login = async function () {
if (!formRef.value) return
try {
await formRef.value.validate()
} catch (err) {
return
}
if(loading.value) { if(loading.value) {
console.log('正在登录,请稍后') console.log('正在登录,请稍后')
@ -51,11 +128,15 @@ const login = async function () {
loading.value = true loading.value = true
try { try {
let params = {
...form.value,
uuid: localStorage.getItem('uuid')
}
const result = await request({ const result = await request({
url: '/admin/login', url: '/admin/login',
data: form.value
data: params
}) })
console.log('传给后端的参数', form.value)
console.log('传给后端的参数', params)
if (result.code === 200) { if (result.code === 200) {
// token // token
@ -97,8 +178,10 @@ const login = async function () {
} else { } else {
form.value.password = '' form.value.password = ''
form.value.account = '' form.value.account = ''
form.value.captcha = ''
ElMessage.error(result.msg) ElMessage.error(result.msg)
loading.value = false //loading loading.value = false //loading
getCaptcha()
} }
} catch (error) { } catch (error) {
console.log('请求失败', error) console.log('请求失败', error)
@ -161,16 +244,22 @@ const selectMarket = async function () {
onMounted(() => { onMounted(() => {
getMachineId() getMachineId()
getCaptcha()
})
onUnmounted(() => {
clearCaptchaCooldown()
}) })
</script> </script>
<template> <template>
<el-row class="login-page"> <el-row class="login-page">
<img :span="12" src="../assets/background.jpg" alt="logo" class="bg" fit="fit"/>
<el-col :span="12" class="bg-container">
<img src="../assets/background.jpg" alt="logo" class="bg" fit="fit"/>
</el-col>
<el-col :span="6" :offset="3" class="form"> <el-col :span="6" :offset="3" class="form">
<!-- 登录表单 --> <!-- 登录表单 -->
<el-form :model="form" size="large" autocomplete="off">
<el-form :model="form" :rules="rules" ref="formRef" size="large" autocomplete="off">
<el-form-item> <el-form-item>
<h1 style="color: #409eff">熵盾管理系统 V1.0</h1> <h1 style="color: #409eff">熵盾管理系统 V1.0</h1>
</el-form-item> </el-form-item>
@ -185,7 +274,20 @@ onMounted(() => {
required required
/> />
</el-form-item> </el-form-item>
<el-form-item class="flex"></el-form-item>
<el-form-item prop="captcha" required>
<el-row :gutter="20" style="width: 100%">
<el-col :span="16">
<el-input v-model="form.captcha" placeholder="请输入验证码" @keyup.enter="login"></el-input>
</el-col>
<el-col :span="8" style="display: flex; align-items: center; justify-content: center;">
<img v-if="captchaUrl" :src="captchaUrl" @click="getCaptcha" style="width: 100%; height: 40px; cursor: pointer; border-radius: 4px;" alt="验证码" title="点击刷新验证码" />
<div v-else @click="getCaptcha" class="failed">
<img src="@/assets/images/loadingFaild.png" >
<text>点击刷新二维码</text>
</div>
</el-col>
</el-row>
</el-form-item>
<!-- 登录按钮 --> <!-- 登录按钮 -->
<el-form-item> <el-form-item>
<button type="button" class="button" @click="login()"> <button type="button" class="button" @click="login()">
@ -205,7 +307,7 @@ onMounted(() => {
.bg { .bg {
border-radius: 0 20px 20px 0; border-radius: 0 20px 20px 0;
height: 110vh; height: 110vh;
width: 50%;
width: 100%;
object-fit: cover; object-fit: cover;
} }
@ -228,15 +330,27 @@ onMounted(() => {
.button { .button {
width: 100%; width: 100%;
margin-top: 20px;
} }
.flex {
width: 100%;
.failed{
display: flex;
flex-direction: column;
align-items: center;
img{
height: 20px;
}
text{
color: #666666;
font-size: 10px;
white-space: nowrap;
height: 20px;
display: flex; display: flex;
justify-content: space-between;
align-items: center;
} }
} }
}
/* From Uiverse.io by kamehame-ha */ /* From Uiverse.io by kamehame-ha */
.button { .button {
height: 50px; height: 50px;

2
src/views/moneyManage/financialAccount/cashFlow.vue

@ -29,6 +29,8 @@ const paytypeList = [
t('cash.payMethods.nets'), t('cash.payMethods.nets'),
t('cash.payMethods.transfer'), t('cash.payMethods.transfer'),
t('cash.payMethods.paypal'), t('cash.payMethods.paypal'),
t('cash.payMethods.stripe2'),
t('cash.payMethods.paysolution'),
] ]
const payPlatformOptions = ref([...paytypeList]) const payPlatformOptions = ref([...paytypeList])

20
src/views/moneyManage/receiveDetail/receiveFinance.vue

@ -658,6 +658,7 @@ import { editFormRule } from './utils/recriveFormRules.js';
import { productList, MarketNameForId, CurrencyForId, marketList, normalizeSubmitterMarket } from './utils/staticData.js'; import { productList, MarketNameForId, CurrencyForId, marketList, normalizeSubmitterMarket } from './utils/staticData.js';
import { useAdminStore } from '@/store/index.js'; import { useAdminStore } from '@/store/index.js';
import { hasMenuPermission } from '@/utils/menuTreePermission.js'; import { hasMenuPermission } from '@/utils/menuTreePermission.js';
import { useRoute } from 'vue-router';
// //
import { useI18n } from 'vue-i18n' import { useI18n } from 'vue-i18n'
@ -666,6 +667,7 @@ const { t } = useI18n()
// ===================== 1. ===================== // ===================== 1. =====================
const adminStore = useAdminStore(); const adminStore = useAdminStore();
const { menuTree } = storeToRefs(adminStore); const { menuTree } = storeToRefs(adminStore);
const route = useRoute();
// caiwu=true // caiwu=true
const kefu = ref(false); const kefu = ref(false);
@ -689,6 +691,15 @@ const getTime = ref([]);
// //
const activeTab = ref('wait'); const activeTab = ref('wait');
const applyTabFromRoute = (tabRaw) => {
const tab = typeof tabRaw === 'string' ? tabRaw : null;
if (tab !== 'wait' && tab !== 'pass' && tab !== 'reject' && tab !== 'done') return false;
if (tab === activeTab.value) return false;
activeTab.value = tab;
pageInfo.value.pageNum = 1;
return true;
};
// //
const auditFormisible = ref(false); const auditFormisible = ref(false);
const auditFormData = ref({}); const auditFormData = ref({});
@ -768,6 +779,8 @@ const paytypeList = [
t('cash.payMethods.nets'), t('cash.payMethods.nets'),
t('cash.payMethods.transfer'), t('cash.payMethods.transfer'),
t('cash.payMethods.paypal'), t('cash.payMethods.paypal'),
t('cash.payMethods.stripe2'),
t('cash.payMethods.paysolution'),
]; ];
const paytypeOptions = ref([...paytypeList]); const paytypeOptions = ref([...paytypeList]);
@ -1082,6 +1095,12 @@ const navigateTo = async (tab) => {
await getlist(); await getlist();
}; };
watch(() => route.query?.tab, async (tab) => {
if (applyTabFromRoute(tab)) {
await getlist();
}
});
// 2.4 // 2.4
// //
const openAuditForm = (row) => { const openAuditForm = (row) => {
@ -1361,6 +1380,7 @@ const throttledsubmitRefund = _.throttle(submitRefund, 5000, {
onMounted(async () => { onMounted(async () => {
await getAdminData(); await getAdminData();
await getActivitys(); await getActivitys();
applyTabFromRoute(route.query?.tab);
// //
await getlist(); await getlist();

20
src/views/moneyManage/receiveDetail/receiveManage.vue

@ -658,6 +658,7 @@ import { editFormRule } from './utils/recriveFormRules.js';
import { productList, MarketNameForId, CurrencyForId, marketList, normalizeSubmitterMarket } from './utils/staticData.js'; import { productList, MarketNameForId, CurrencyForId, marketList, normalizeSubmitterMarket } from './utils/staticData.js';
import { useAdminStore } from '@/store/index.js'; import { useAdminStore } from '@/store/index.js';
import { hasMenuPermission } from '@/utils/menuTreePermission.js'; import { hasMenuPermission } from '@/utils/menuTreePermission.js';
import { useRoute } from 'vue-router';
// //
import { useI18n } from 'vue-i18n' import { useI18n } from 'vue-i18n'
@ -666,6 +667,7 @@ const { t } = useI18n()
// ===================== 1. ===================== // ===================== 1. =====================
const adminStore = useAdminStore(); const adminStore = useAdminStore();
const { menuTree } = storeToRefs(adminStore); const { menuTree } = storeToRefs(adminStore);
const route = useRoute();
// caiwu=true // caiwu=true
const kefu = ref(false); const kefu = ref(false);
@ -689,6 +691,15 @@ const getTime = ref([]);
// //
const activeTab = ref('wait'); const activeTab = ref('wait');
const applyTabFromRoute = (tabRaw) => {
const tab = typeof tabRaw === 'string' ? tabRaw : null;
if (tab !== 'wait' && tab !== 'pass' && tab !== 'reject' && tab !== 'done') return false;
if (tab === activeTab.value) return false;
activeTab.value = tab;
pageInfo.value.pageNum = 1;
return true;
};
// //
const auditFormisible = ref(false); const auditFormisible = ref(false);
const auditFormData = ref({}); const auditFormData = ref({});
@ -768,6 +779,8 @@ const paytypeList = [
t('cash.payMethods.nets'), t('cash.payMethods.nets'),
t('cash.payMethods.transfer'), t('cash.payMethods.transfer'),
t('cash.payMethods.paypal'), t('cash.payMethods.paypal'),
t('cash.payMethods.stripe2'),
t('cash.payMethods.paysolution'),
]; ];
const paytypeOptions = ref([...paytypeList]); const paytypeOptions = ref([...paytypeList]);
@ -1082,6 +1095,12 @@ const navigateTo = async (tab) => {
await getlist(); await getlist();
}; };
watch(() => route.query?.tab, async (tab) => {
if (applyTabFromRoute(tab)) {
await getlist();
}
});
// 2.4 // 2.4
// //
const openAuditForm = (row) => { const openAuditForm = (row) => {
@ -1361,6 +1380,7 @@ const throttledsubmitRefund = _.throttle(submitRefund, 5000, {
onMounted(async () => { onMounted(async () => {
await getAdminData(); await getAdminData();
await getActivitys(); await getActivitys();
applyTabFromRoute(route.query?.tab);
// //
await getlist(); await getlist();

14
src/views/moneyManage/receiveDetail/receiveService.vue

@ -659,6 +659,12 @@ const ifGroup = () => {
} else if (addFormData.value.payType === t('cash.payMethods.grabpay') || addFormData.value.payType === t('cash.payMethods.nets') || addFormData.value.payType === t('cash.payMethods.paypal')) { } else if (addFormData.value.payType === t('cash.payMethods.grabpay') || addFormData.value.payType === t('cash.payMethods.nets') || addFormData.value.payType === t('cash.payMethods.paypal')) {
isGroup.value = true isGroup.value = true
addFormData.value.receivedMarket = t('cash.markets.Singapore') addFormData.value.receivedMarket = t('cash.markets.Singapore')
}else if (addFormData.value.payType === t('cash.payMethods.paysolution')) {
isGroup.value = true
addFormData.value.receivedMarket = t('cash.markets.Thailand')
} else if (addFormData.value.payType === t('cash.payMethods.stripe2')) {
isGroup.value = true
addFormData.value.receivedMarket = t('cash.markets.Singapore')
} else { } else {
isGroup.value = false isGroup.value = false
} }
@ -924,7 +930,9 @@ const paytypeOptions = ref([
t('cash.payMethods.bankTransfer'),// t('cash.payMethods.bankTransfer'),//
t('cash.payMethods.card'), // t('cash.payMethods.card'), //
t('cash.payMethods.cash'), // t('cash.payMethods.cash'), //
t('cash.payMethods.check') //
t('cash.payMethods.check'), //
t('cash.payMethods.paysolution'), // Paysolution
t('cash.payMethods.stripe2'), // Stripe2
]) ])
const MoneyAddressOptions = ref([ const MoneyAddressOptions = ref([
t('cash.markets.Malaysia'), // 西 t('cash.markets.Malaysia'), // 西
@ -1192,7 +1200,9 @@ const paytypeList = ref([
t('cash.payMethods.grabpay'), // Grabpay t('cash.payMethods.grabpay'), // Grabpay
t('cash.payMethods.nets'), // Nets t('cash.payMethods.nets'), // Nets
t('cash.payMethods.transfer'), // E-Transfer t('cash.payMethods.transfer'), // E-Transfer
t('cash.payMethods.paypal') // PayPal
t('cash.payMethods.paypal'), // PayPal
t('cash.payMethods.stripe2'), // Stripe2
t('cash.payMethods.paysolution'), // Paysolution
]) ])
const getMarket = async function () { const getMarket = async function () {
try { try {

8
src/views/moneyManage/refundDetail/refundHeader.vue

@ -470,6 +470,14 @@ const executorList = ref([
value: '315915', value: '315915',
label: '越:范秋霞' label: '越:范秋霞'
}, },
{
value: '200246',
label: '马:小汪执行人'
},
{
value: '90047947',
label: '总部:测试'
}
]) ])
// //
const getRefund = async function () { const getRefund = async function () {

4
src/views/moneyManage/refundDetail/refundService.vue

@ -577,7 +577,9 @@ const channelOptions = computed(() => [
t('cash.payMethods.grabpay'), t('cash.payMethods.grabpay'),
t('cash.payMethods.nets'), t('cash.payMethods.nets'),
t('cash.payMethods.transfer'), t('cash.payMethods.transfer'),
t('cash.payMethods.paypal')
t('cash.payMethods.paypal'),
t('cash.payMethods.stripe2'),
t('cash.payMethods.paysolution'),
]) ])
const reset = function () { const reset = function () {

84
src/views/recharge/gold/addCoinRecharge.vue

@ -77,11 +77,12 @@ const recharge = ref({
// cookie key // cookie key
const WriteCookies = ref(null) const WriteCookies = ref(null)
// cookie value // cookie value
const WriteCookiesTime = ref(null)
const WriteCookiesVale = ref(null)
// cookie key // cookie key
const ReadCookies = ref(null) const ReadCookies = ref(null)
// cookie value // cookie value
const ReadCookiesTime = ref(null)
const ReadCookiesValue = ref({})
const orderStatus = ref('')
// //
const add = async function () { const add = async function () {
try { try {
@ -107,12 +108,7 @@ const add = async function () {
console.log('开始添加充值信息', recharge.value) console.log('开始添加充值信息', recharge.value)
// jwcode // jwcode
// jwcode:permanentGold:freeGold
WriteCookies.value = `coinRecharge:${recharge.value.jwcode}:${recharge.value.permanentGold}:${recharge.value.freeGold}`
//value
WriteCookiesTime.value = recharge.value.payTime
// cookies,jwcodekeyvaluejwcode1
Cookies.set(WriteCookies.value, WriteCookiesTime.value, {expires: 1, path: '/'});
// POST // POST
addDisabled.value = true addDisabled.value = true
const result = await API({ const result = await API({
@ -120,6 +116,17 @@ const add = async function () {
data: formattedRecharge data: formattedRecharge
}) })
addDisabled.value = false addDisabled.value = false
if(result.code == 200){
// jwcode:permanentGold:freeGold
WriteCookies.value = `coinRecharge-${recharge.value.jwcode}-${recharge.value.permanentGold}-${recharge.value.freeGold}`
//value
WriteCookiesVale.value = JSON.stringify({
payTime: moment(result.data.createTime).format("YYYY-MM-DD HH:mm:ss"),
orderCode: result.data.orderCoder,
});
// cookies,jwcodekeyvaluejwcode1
Cookies.set(WriteCookies.value, WriteCookiesVale.value, {expires: 1, path: '/'});
}
if (result.code === 0) { if (result.code === 0) {
ElMessage.error(result.msg) ElMessage.error(result.msg)
return return
@ -187,6 +194,25 @@ const FirstRechargeDialogVisibleCancel = () => {
user.value = {} user.value = {}
}; };
const historyOrder = ref({})
//
const selectByOrderCode = async function (data) {
try {
const result = await API({
url: '/recharge/selectByOrderCode',
data: data,
headers: {
'Content-Type': 'text/plain;charset=utf-8'
},
})
if(result.code == 200){
historyOrder.value = result.data
}
} catch (error) {
console.log('请求失败', error)
//
}
}
// //
const addBefore = () => { const addBefore = () => {
// //
@ -249,16 +275,38 @@ const addBefore = () => {
// cookie // cookie
// jwcode:permanentGold:freeGold // jwcode:permanentGold:freeGold
ReadCookies.value = `coinRecharge:${recharge.value.jwcode}:${recharge.value.permanentGold}:${recharge.value.freeGold}`
ReadCookies.value = `coinRecharge-${recharge.value.jwcode}-${recharge.value.permanentGold}-${recharge.value.freeGold}`
console.log('ReadCookies',ReadCookies.value);
// cookie // cookie
const cookie = Cookies.get(ReadCookies.value)
console.log("time", WriteCookiesTime.value)
//
ReadCookiesTime.value = moment(cookie).format('YYYY-MM-DD HH:mm:ss')
console.log('cookie', cookie)
// cookie
if (cookie) {
const cookieValue = Cookies.get(ReadCookies.value);
if (cookieValue) {
//
const rechargeInfo = JSON.parse(cookieValue);
console.log('充值时间:', rechargeInfo.payTime);
console.log('订单号:', rechargeInfo.orderCode);
ReadCookiesValue.value = {
...rechargeInfo,
}
}else{
ReadCookiesValue.value = {}
}
if (Object.keys(ReadCookiesValue.value).length > 0) {
await selectByOrderCode(ReadCookiesValue.value.orderCode)
if(historyOrder.value.type == 0 ){
if(historyOrder.value.auditStatus == 0){
orderStatus.value = t('recharge.waitAudit')
}else if(historyOrder.value.auditStatus == 1){
if(historyOrder.value.isRefund == 1){
orderStatus.value = t('recharge.refunded')
}else{
orderStatus.value = t('recharge.passed')
}
}else if(historyOrder.value.auditStatus == 2){
orderStatus.value = t('recharge.rejected')
}
}
RechargeDialogVisible.value = true; RechargeDialogVisible.value = true;
} else { } else {
FirstRechargeDialogVisible.value = true; FirstRechargeDialogVisible.value = true;
@ -871,8 +919,8 @@ onMounted(() => {
<div> <div>
<el-divider border-style="dashed"/> <el-divider border-style="dashed"/>
<p>{{ $t('common_add.similarRechargeRecords') }}</p> <p>{{ $t('common_add.similarRechargeRecords') }}</p>
· {{ ReadCookiesTime }} {{ $t('common_add.rechargePermanentGold') }}: {{ recharge.permanentGold }}
{{ $t('common_add.freeGold') }}: {{ recharge.freeGold }}({{ $t('common_add.operator') }}{{ adminData.adminName }})
· {{ moment(ReadCookiesValue.payTime).format('YYYY-MM-DD HH:mm:ss') }} {{ $t('common_add.rechargePermanentGold') }}: {{ recharge.permanentGold }}
{{ $t('common_add.freeGold') }}: {{ recharge.freeGold }} {{ $t('common_add.orderStatus')}}: {{ orderStatus }}({{ $t('common_add.operator') }}{{ adminData.adminName }})
</div> </div>
<div style="margin-top: 10px"> <div style="margin-top: 10px">
<p>{{ $t('common_add.continueOperation') }}</p> <p>{{ $t('common_add.continueOperation') }}</p>

Loading…
Cancel
Save