consume-editable-policy.js 2.54 KB
import sysConfigApi from '@/apis/modules/sys-config.js'

export const CONSUME_EDITABLE_POLICY_KEY = 'consumeEditablePolicy'

const DEFAULT_POLICY = {
	editableDays: 3,
	allowCrossMonth: false
}

export function parseConsumeEditablePolicy(data = {}) {
	const days = parseInt(data.consumeEditableDays, 10)
	return {
		editableDays: isNaN(days) || days < 1 ? DEFAULT_POLICY.editableDays : days,
		allowCrossMonth: Number(data.consumeAllowCrossMonthEdit) === 1
	}
}

/**
 * 与后端 ConsumeEditableDaysHelper 口径一致:先校验天数,再校验跨月
 */
export function canConsumeMiniProgramEdit(row, policy = DEFAULT_POLICY) {
	if (!row) return false
	const baseTime = parseConsumeBaseTime(row)
	if (!baseTime) return false

	const now = Date.now()
	if (now > baseTime.getTime() + policy.editableDays * 86400000) {
		return false
	}

	if (!policy.allowCrossMonth) {
		const nowDate = new Date()
		if (
			baseTime.getFullYear() !== nowDate.getFullYear() ||
			baseTime.getMonth() !== nowDate.getMonth()
		) {
			return false
		}
	}

	return true
}

export function parseConsumeBaseTime(row) {
	const raw = row.hksj || row.Hksj || row.createTime || row.CreateTime
	if (!raw) return null
	const date = new Date(raw)
	return isNaN(date.getTime()) ? null : date
}

export function loadConsumeEditablePolicy(force = false) {
	if (!force) {
		const cached = uni.getStorageSync(CONSUME_EDITABLE_POLICY_KEY)
		if (cached && typeof cached === 'object') {
			refreshConsumeEditablePolicy()
			return Promise.resolve(cached)
		}
	}
	return refreshConsumeEditablePolicy()
}

export function refreshConsumeEditablePolicy() {
	return sysConfigApi.getSysConfig()
		.then(res => {
			const policy = parseConsumeEditablePolicy((res && res.data) || {})
			uni.setStorageSync(CONSUME_EDITABLE_POLICY_KEY, policy)
			uni.$emit && uni.$emit('consume-editable-policy-change', policy)
			return policy
		})
		.catch(() => {
			const cached = uni.getStorageSync(CONSUME_EDITABLE_POLICY_KEY)
			return cached && typeof cached === 'object' ? cached : { ...DEFAULT_POLICY }
		})
}

export function getConsumeEditablePolicy() {
	const cached = uni.getStorageSync(CONSUME_EDITABLE_POLICY_KEY)
	return cached && typeof cached === 'object' ? cached : { ...DEFAULT_POLICY }
}

export function clearConsumeEditablePolicy() {
	uni.removeStorageSync(CONSUME_EDITABLE_POLICY_KEY)
}

export default {
	CONSUME_EDITABLE_POLICY_KEY,
	parseConsumeEditablePolicy,
	canConsumeMiniProgramEdit,
	parseConsumeBaseTime,
	loadConsumeEditablePolicy,
	refreshConsumeEditablePolicy,
	getConsumeEditablePolicy,
	clearConsumeEditablePolicy
}