修改套餐状态

This commit is contained in:
wuweihua
2026-09-20 10:29:10 +08:00
parent 24435e4113
commit cc5f1cf5de
15 changed files with 96 additions and 61 deletions
@@ -152,15 +152,23 @@ public class PriceSetController extends BaseController
} }
@PreAuthorize("@ss.hasPermi('price:set:audit')") @PreAuthorize("@ss.hasPermi('price:set:audit')")
@Log(title = "价格套餐停用", businessType = BusinessType.UPDATE) @Log(title = "Price set disable", businessType = BusinessType.UPDATE)
@PutMapping("/disable/{priceSetId}") @PutMapping("/disable/{priceSetId}")
public AjaxResult disable(@PathVariable Long priceSetId) public AjaxResult disable(@PathVariable Long priceSetId)
{ {
return toAjax(priceSetService.disable(priceSetId, getUsername())); return toAjax(priceSetService.disable(priceSetId, getUsername()));
} }
@PreAuthorize("@ss.hasPermi('price:set:audit')")
@Log(title = "Price set enable", businessType = BusinessType.UPDATE)
@PutMapping("/enable/{priceSetId}")
public AjaxResult enable(@PathVariable Long priceSetId)
{
return toAjax(priceSetService.enable(priceSetId, getUsername()));
}
@PreAuthorize("@ss.hasPermi('price:set:add')") @PreAuthorize("@ss.hasPermi('price:set:add')")
@Log(title = "价格套餐复用", businessType = BusinessType.INSERT) @Log(title = "Price set copy", businessType = BusinessType.INSERT)
@PostMapping("/copy/{priceSetId}") @PostMapping("/copy/{priceSetId}")
public AjaxResult copy(@PathVariable Long priceSetId) public AjaxResult copy(@PathVariable Long priceSetId)
{ {
@@ -54,12 +54,13 @@ price.set.name.exists=套餐名称已存在
price.set.effectiveDate.empty=生效日期不能为空 price.set.effectiveDate.empty=生效日期不能为空
price.set.date.invalid=生效日期不能晚于失效日期 price.set.date.invalid=生效日期不能晚于失效日期
price.set.discount.range=折扣模式默认折扣需在 1~99 price.set.discount.range=折扣模式默认折扣需在 1~99
price.set.delete.statusNotAllowed=仅草稿或驳回状态的套餐允许删除:{0} price.set.delete.statusNotAllowed=仅待启用或驳回状态的套餐允许删除:{0}
price.set.delete.boundCustomer=套餐【{0}】已绑定客户,请先解绑后再删除 price.set.delete.boundCustomer=套餐【{0}】已绑定客户,请先解绑后再删除
price.set.submit.statusNotAllowed=当前状态不允许提交审核 price.set.submit.statusNotAllowed=当前状态不允许提交审核
price.set.approve.statusNotAllowed=仅审核中的套餐可以生效 price.set.approve.statusNotAllowed=仅审核中的套餐可以生效
price.set.reject.statusNotAllowed=仅审核中的套餐可以驳回 price.set.reject.statusNotAllowed=仅审核中的套餐可以驳回
price.set.disable.statusNotAllowed=仅生效中的套餐可以停用 price.set.disable.statusNotAllowed=仅生效中的套餐可停用
price.set.enable.statusNotAllowed=套餐已是生效状态
price.set.edit.audit=审核中的套餐不允许修改 price.set.edit.audit=审核中的套餐不允许修改
price.set.edit.stopped=已停用的套餐不允许修改,请使用复用新建 price.set.edit.stopped=已停用的套餐不允许修改,请使用复用新建
price.set.childEdit.audit=审核中的套餐不允许改明细或客户 price.set.childEdit.audit=审核中的套餐不允许改明细或客户
@@ -59,7 +59,7 @@ public class BmsCustomerPriceSet extends BaseEntity
/** 计价类型 FIXED=固定价 DISCOUNT=折扣 */ /** 计价类型 FIXED=固定价 DISCOUNT=折扣 */
private String setType; private String setType;
/** 套餐状态 D草稿 A审核中 E生效 R驳回 S停用 */ /** Package status D=pending-enable A=audit E=effective R=reject S=stopped */
private String priceSetStatus; private String priceSetStatus;
/** 套餐生效日期 */ /** 套餐生效日期 */
@@ -26,7 +26,7 @@ public class BmsPriceSetOption
/** 计价类型 FIXED=固定价 DISCOUNT=折扣 */ /** 计价类型 FIXED=固定价 DISCOUNT=折扣 */
private String setType; private String setType;
/** 套餐状态 D草稿 A审核中 E生效 R驳回 S停用 */ /** Package status D=pending-enable A=audit E=effective R=reject S=stopped */
private String status; private String status;
/** 生效日期 */ /** 生效日期 */
@@ -34,6 +34,9 @@ public interface IPrcPriceSetService
public int disable(Long priceSetId, String updateBy); public int disable(Long priceSetId, String updateBy);
/** Re-enable a stopped package (S -> E). */
public int enable(Long priceSetId, String updateBy);
/** /**
* Activate a draft or reschedule a pending version with user-specified effectiveTime. * Activate a draft or reschedule a pending version with user-specified effectiveTime.
* effectiveTime <= now -> EFFECT; future -> PENDING(3). Then refresh 0/3/1/2. * effectiveTime <= now -> EFFECT; future -> PENDING(3). Then refresh 0/3/1/2.
@@ -49,6 +49,7 @@ import com.ruoyi.price.task.PrcPriceSetSaveAsyncRunner;
@Service @Service
public class PrcPriceSetServiceImpl implements IPrcPriceSetService public class PrcPriceSetServiceImpl implements IPrcPriceSetService
{ {
/** Package status: D pending-enable / A audit / E effective / R reject / S stopped */
private static final String STATUS_DRAFT = "D"; private static final String STATUS_DRAFT = "D";
private static final String STATUS_AUDIT = "A"; private static final String STATUS_AUDIT = "A";
private static final String STATUS_EFFECT = "E"; private static final String STATUS_EFFECT = "E";
@@ -271,6 +272,23 @@ public class PrcPriceSetServiceImpl implements IPrcPriceSetService
return setMapper.updatePrcPriceSetStatus(upd); return setMapper.updatePrcPriceSetStatus(upd);
} }
@Override
public int enable(Long priceSetId, String updateBy)
{
PrcPriceSet db = requireSet(priceSetId);
if (STATUS_EFFECT.equals(db.getStatus()))
{
throw new ServiceException(MessageUtils.message("price.set.enable.statusNotAllowed"));
}
PrcPriceSet upd = new PrcPriceSet();
upd.setPriceSetId(priceSetId);
upd.setStatus(STATUS_EFFECT);
upd.setUpdateBy(updateBy);
int rows = setMapper.updatePrcPriceSetStatus(upd);
refreshVersionStatus(priceSetId);
return rows;
}
@Override @Override
@Transactional @Transactional
public int activateVersion(Long psvId, Date effectiveTime, String updateBy) public int activateVersion(Long psvId, Date effectiveTime, String updateBy)
@@ -272,7 +272,7 @@ public class TmsPriceQuoteServiceImpl implements ITmsPriceQuoteService
for (PrcCustomerPriceSet bind : binds) for (PrcCustomerPriceSet bind : binds)
{ {
PrcPriceSet set = priceSetMapper.selectPrcPriceSetById(bind.getPriceSetId()); PrcPriceSet set = priceSetMapper.selectPrcPriceSetById(bind.getPriceSetId());
if (set == null || "S".equals(set.getStatus())) if (set == null || !"E".equals(set.getStatus()))
{ {
continue; continue;
} }
@@ -13,8 +13,6 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<result property="defaultDiscount" column="default_discount" /> <result property="defaultDiscount" column="default_discount" />
<result property="defaultType" column="default_type" /> <result property="defaultType" column="default_type" />
<result property="calculateSign" column="calculate_sign" /> <result property="calculateSign" column="calculate_sign" />
<result property="effectiveDate" column="effective_date" />
<result property="expireDate" column="expire_date" />
<result property="status" column="status" /> <result property="status" column="status" />
<result property="tmsId" column="tms_id" /> <result property="tmsId" column="tms_id" />
<result property="createBy" column="created_by" /> <result property="createBy" column="created_by" />
@@ -28,7 +26,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<sql id="selectPrcPriceSetVo"> <sql id="selectPrcPriceSetVo">
select s.price_set_id, s.price_set_code, s.price_set_name, s.price_set_note, select s.price_set_id, s.price_set_code, s.price_set_name, s.price_set_note,
s.set_type, s.default_discount, s.default_type, s.calculate_sign, s.set_type, s.default_discount, s.default_type, s.calculate_sign,
s.effective_date, s.expire_date, s.status, s.tms_id, s.status, s.tms_id,
s.created_by, s.create_time, s.updated_by, s.update_time, s.created_by, s.create_time, s.updated_by, s.update_time,
(select count(distinct d.product_code) from prc_price_set_detail d where d.price_set_id = s.price_set_id) as product_count, (select count(distinct d.product_code) from prc_price_set_detail d where d.price_set_id = s.price_set_id) as product_count,
(select count(1) from prc_customer_price_set c where c.price_set_id = s.price_set_id) as customer_count (select count(1) from prc_customer_price_set c where c.price_set_id = s.price_set_id) as customer_count
@@ -93,8 +91,6 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="defaultDiscount != null">default_discount,</if> <if test="defaultDiscount != null">default_discount,</if>
<if test="defaultType != null">default_type,</if> <if test="defaultType != null">default_type,</if>
<if test="calculateSign != null">calculate_sign,</if> <if test="calculateSign != null">calculate_sign,</if>
<if test="effectiveDate != null">effective_date,</if>
<if test="expireDate != null">expire_date,</if>
<if test="status != null and status != ''">status,</if> <if test="status != null and status != ''">status,</if>
<if test="tmsId != null">tms_id,</if> <if test="tmsId != null">tms_id,</if>
<if test="createBy != null and createBy != ''">created_by,</if> <if test="createBy != null and createBy != ''">created_by,</if>
@@ -107,8 +103,6 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="defaultDiscount != null">#{defaultDiscount},</if> <if test="defaultDiscount != null">#{defaultDiscount},</if>
<if test="defaultType != null">#{defaultType},</if> <if test="defaultType != null">#{defaultType},</if>
<if test="calculateSign != null">#{calculateSign},</if> <if test="calculateSign != null">#{calculateSign},</if>
<if test="effectiveDate != null">#{effectiveDate},</if>
<if test="expireDate != null">#{expireDate},</if>
<if test="status != null and status != ''">#{status},</if> <if test="status != null and status != ''">#{status},</if>
<if test="tmsId != null">#{tmsId},</if> <if test="tmsId != null">#{tmsId},</if>
<if test="createBy != null and createBy != ''">#{createBy},</if> <if test="createBy != null and createBy != ''">#{createBy},</if>
@@ -126,8 +120,6 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
default_discount = #{defaultDiscount}, default_discount = #{defaultDiscount},
<if test="defaultType != null">default_type = #{defaultType},</if> <if test="defaultType != null">default_type = #{defaultType},</if>
<if test="calculateSign != null">calculate_sign = #{calculateSign},</if> <if test="calculateSign != null">calculate_sign = #{calculateSign},</if>
<if test="effectiveDate != null">effective_date = #{effectiveDate},</if>
expire_date = #{expireDate},
<if test="status != null and status != ''">status = #{status},</if> <if test="status != null and status != ''">status = #{status},</if>
<if test="tmsId != null">tms_id = #{tmsId},</if> <if test="tmsId != null">tms_id = #{tmsId},</if>
<if test="updateBy != null and updateBy != ''">updated_by = #{updateBy},</if> <if test="updateBy != null and updateBy != ''">updated_by = #{updateBy},</if>
@@ -140,7 +132,6 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
update prc_price_set update prc_price_set
<set> <set>
status = #{status}, status = #{status},
<if test="effectiveDate != null">effective_date = #{effectiveDate},</if>
<if test="updateBy != null and updateBy != ''">updated_by = #{updateBy},</if> <if test="updateBy != null and updateBy != ''">updated_by = #{updateBy},</if>
update_time = sysdate() update_time = sysdate()
</set> </set>
+7
View File
@@ -142,6 +142,13 @@ export function disablePriceSet(priceSetId) {
}) })
} }
export function enablePriceSet(priceSetId) {
return request({
url: '/price/set/enable/' + priceSetId,
method: 'put'
})
}
export function copyPriceSet(priceSetId) { export function copyPriceSet(priceSetId) {
return request({ return request({
url: '/price/set/copy/' + priceSetId, url: '/price/set/copy/' + priceSetId,
@@ -800,8 +800,8 @@ function removeProduct(productId) {
/* ---------------- 套餐绑定(prc_customer_price_set,一客户一套餐) ---------------- */ /* ---------------- 套餐绑定(prc_customer_price_set,一客户一套餐) ---------------- */
const setTypeMap = { FIXED: '固定价', DISCOUNT: '折扣' } const setTypeMap = { FIXED: '固定价', DISCOUNT: '折扣' }
const priceSetStatusMap = { D: '草稿', A: '审核中', E: '生效', R: '驳回', S: '停用' } const priceSetStatusMap = { D: '待启用', A: '审核中', E: '生效', R: '驳回', S: '停用' }
const priceSetStatusTagType = { D: 'info', A: 'warning', E: 'success', R: 'danger', S: 'info' } const priceSetStatusTagType = { D: 'warning', A: 'warning', E: 'success', R: 'danger', S: 'info' }
const boundPriceSets = ref([]) const boundPriceSets = ref([])
const priceSetOptions = ref([]) const priceSetOptions = ref([])
@@ -4,6 +4,7 @@
<div class="hd-line"> <div class="hd-line">
<h2 class="hd-name">{{ set.priceSetName || '套餐详情' }}</h2> <h2 class="hd-name">{{ set.priceSetName || '套餐详情' }}</h2>
<span v-if="set.priceSetCode" class="hd-code">{{ set.priceSetCode }}</span> <span v-if="set.priceSetCode" class="hd-code">{{ set.priceSetCode }}</span>
<el-tag :type="setStatusTagType(set)" size="small">{{ setStatusLabel(set) }}</el-tag>
</div> </div>
<div class="hd-line hd-meta"> <div class="hd-line hd-meta">
<el-tag :type="isFixedType(set.setType) ? 'warning' : 'primary'" size="small" effect="plain"> <el-tag :type="isFixedType(set.setType) ? 'warning' : 'primary'" size="small" effect="plain">
@@ -15,31 +16,31 @@
<div class="hd-actions"> <div class="hd-actions">
<el-button @click="emit('back')">返回列表</el-button> <el-button @click="emit('back')">返回列表</el-button>
<el-button <el-button
v-if="set.status === 'E' && !set.expired" v-if="set.status === 'E'"
type="danger" type="danger"
plain plain
@click="emit('disable')" @click="emit('disable')"
v-hasPermi="['price:set:audit']" v-hasPermi="['price:set:audit']"
>停用</el-button> >停用</el-button>
<el-button <el-button
v-else-if="set.status === 'S'" v-if="set.status !== 'E'"
type="primary" type="success"
plain plain
@click="emit('copy')" @click="emit('enable')"
v-hasPermi="['price:set:add']" v-hasPermi="['price:set:audit']"
>复用新建</el-button> >启用</el-button>
</div> </div>
</div> </div>
</template> </template>
<script setup name="SetDetailHeader"> <script setup name="SetDetailHeader">
import { isFixedType, setTypeLabel } from '../../utils/priceSet' import { isFixedType, setTypeLabel, setStatusLabel, setStatusTagType } from '../../utils/priceSet'
defineProps({ defineProps({
set: { type: Object, required: true } set: { type: Object, required: true }
}) })
const emit = defineEmits(['back', 'disable', 'copy']) const emit = defineEmits(['back', 'disable', 'enable'])
</script> </script>
<style scoped> <style scoped>
+2 -2
View File
@@ -23,7 +23,7 @@
<el-button @click="goBack">取消</el-button> <el-button @click="goBack">取消</el-button>
<el-button v-if="active > 0 && !directStep2" @click="active--">上一步</el-button> <el-button v-if="active > 0 && !directStep2" @click="active--">上一步</el-button>
<el-button v-if="active === 0" type="primary" :loading="creating" @click="goStep2">创建套餐价格</el-button> <el-button v-if="active === 0" type="primary" :loading="creating" @click="goStep2">创建套餐价格</el-button>
<el-button v-if="active === 0" type="info" :loading="saving" @click="saveDraft">保存草稿</el-button> <el-button v-if="active === 0" type="info" :loading="saving" @click="saveDraft">保存</el-button>
<el-button v-if="active === 1" type="primary" @click="finishEdit">完成</el-button> <el-button v-if="active === 1" type="primary" @click="finishEdit">完成</el-button>
</div> </div>
@@ -199,7 +199,7 @@ async function saveDraft() {
try { try {
const priceSetId = await runSaveWithProgress(buildPayload()) const priceSetId = await runSaveWithProgress(buildPayload())
form.priceSetId = priceSetId form.priceSetId = priceSetId
proxy.$modal.msgSuccess('草稿已保存,套餐ID=' + priceSetId) proxy.$modal.msgSuccess('已保存(待启用),套餐ID=' + priceSetId)
goBack() goBack()
} catch (e) { } catch (e) {
// surfaced // surfaced
+5 -8
View File
@@ -13,7 +13,7 @@
:set="set" :set="set"
@back="goList" @back="goList"
@disable="onDisable" @disable="onDisable"
@copy="onCopy" @enable="onEnable"
/> />
<set-basic-info-card :set="set" /> <set-basic-info-card :set="set" />
@@ -77,7 +77,7 @@ import SetVersionDetailDrawer from './components/detail/SetVersionDetailDrawer.v
import PriceEditPanel from './components/create/PriceEditPanel.vue' import PriceEditPanel from './components/create/PriceEditPanel.vue'
import { usePriceSetRefData } from './composables/usePriceSetRefData' import { usePriceSetRefData } from './composables/usePriceSetRefData'
import { import {
getPriceSet, disablePriceSet, copyPriceSet, activatePriceSetVersion, copyPriceSetVersion, deletePriceSetVersion getPriceSet, disablePriceSet, enablePriceSet, activatePriceSetVersion, copyPriceSetVersion, deletePriceSetVersion
} from '@/api/price/set' } from '@/api/price/set'
const { proxy } = getCurrentInstance() const { proxy } = getCurrentInstance()
@@ -121,6 +121,9 @@ function confirmAction(text, request, successText, done) {
function onDisable() { function onDisable() {
confirmAction('停用后不再参与计费命中,确认停用?', () => disablePriceSet(set.value.priceSetId), '已停用') confirmAction('停用后不再参与计费命中,确认停用?', () => disablePriceSet(set.value.priceSetId), '已停用')
} }
function onEnable() {
confirmAction('启用后套餐将重新参与计费命中,确认启用?', () => enablePriceSet(set.value.priceSetId), '已启用')
}
function formatNow() { function formatNow() {
const d = new Date() const d = new Date()
const p = n => String(n).padStart(2, '0') const p = n => String(n).padStart(2, '0')
@@ -199,12 +202,6 @@ function submitActivate() {
}) })
}) })
} }
function onCopy() {
copyPriceSet(set.value.priceSetId).then(res => {
proxy.$modal.msgSuccess('已复制为草稿')
proxy.$router.push({ path: '/customer/setCreate', query: { priceSetId: res.data } })
})
}
function onCopyVersion(row) { function onCopyVersion(row) {
if (!row || row.psvId == null) return if (!row || row.psvId == null) return
const hasDraft = (set.value.versions || []).some(v => v && String(v.status) === '0') const hasDraft = (set.value.versions || []).some(v => v && String(v.status) === '0')
+23 -16
View File
@@ -25,10 +25,6 @@
</el-tag> </el-tag>
</template> </template>
<template #col-dateRange="{ row }">
{{ formatDate(row.effectiveDate) }} ~ {{ row.expireDate ? formatDate(row.expireDate) : '长期' }}
</template>
<template #col-status="{ row }"> <template #col-status="{ row }">
<el-tag :type="statusTag(row)" size="small">{{ statusLabel(row) }}</el-tag> <el-tag :type="statusTag(row)" size="small">{{ statusLabel(row) }}</el-tag>
</template> </template>
@@ -46,11 +42,19 @@
<template #col-action="{ row }"> <template #col-action="{ row }">
<el-button link type="primary" @click="handleDetail(row)" v-hasPermi="['price:set:query']">详情</el-button> <el-button link type="primary" @click="handleDetail(row)" v-hasPermi="['price:set:query']">详情</el-button>
<el-button <el-button
v-if="row.status === 'E'"
link link
type="warning" type="warning"
@click="handleDisable(row)" @click="handleDisable(row)"
v-hasPermi="['price:set:audit']" v-hasPermi="['price:set:audit']"
>停用</el-button> >停用</el-button>
<el-button
v-if="row.status === 'D' || row.status === 'S'"
link
type="success"
@click="handleEnable(row)"
v-hasPermi="['price:set:audit']"
>启用</el-button>
</template> </template>
</basic-table> </basic-table>
@@ -65,10 +69,10 @@
<script setup name="PriceSet"> <script setup name="PriceSet">
import { import {
listPriceSet, disablePriceSet, copyPriceSet, getPriceSet listPriceSet, disablePriceSet, enablePriceSet, copyPriceSet, getPriceSet
} from '@/api/price/set' } from '@/api/price/set'
import { parseTime } from '@/utils/ruoyi'
import SetVersionDetailDrawer from './components/detail/SetVersionDetailDrawer.vue' import SetVersionDetailDrawer from './components/detail/SetVersionDetailDrawer.vue'
import { setStatusLabel, setStatusTagType } from './utils/priceSet'
const { proxy } = getCurrentInstance() const { proxy } = getCurrentInstance()
const tableRef = ref() const tableRef = ref()
@@ -91,6 +95,7 @@ const searchColumns = [
prop: 'status', prop: 'status',
component: 'select', component: 'select',
options: [ options: [
{ label: '待启用', value: 'D' },
{ label: '生效', value: 'E' }, { label: '生效', value: 'E' },
{ label: '已停用', value: 'S' } { label: '已停用', value: 'S' }
], ],
@@ -105,6 +110,7 @@ const columns = [
{ label: '套餐名称', prop: 'priceSetName', minWidth: 160 }, { label: '套餐名称', prop: 'priceSetName', minWidth: 160 },
{ label: '类型', prop: 'setType', width: 140 }, { label: '类型', prop: 'setType', width: 140 },
{ label: '说明', prop: 'priceSetNote', minWidth: 160 }, { label: '说明', prop: 'priceSetNote', minWidth: 160 },
{ label: '状态', prop: 'status', width: 90 },
{ label: '生效明细', prop: 'activeDetail', width: 100 }, { label: '生效明细', prop: 'activeDetail', width: 100 },
{ label: '操作', prop: 'action', width: 160, showInToolbar: false } { label: '操作', prop: 'action', width: 160, showInToolbar: false }
] ]
@@ -113,20 +119,12 @@ function queryList(params) {
return listPriceSet(params) return listPriceSet(params)
} }
function formatDate(val) {
return val ? parseTime(val, '{y}-{m}-{d}') : ''
}
function statusLabel(row) { function statusLabel(row) {
if (row.expired) return '已过期' return setStatusLabel(row)
const map = { D: '草稿', A: '审核中', E: '生效', R: '驳回', S: '已停用' }
return map[row.status] || row.status
} }
function statusTag(row) { function statusTag(row) {
if (row.expired) return 'danger' return setStatusTagType(row)
const map = { D: 'warning', A: 'primary', E: 'success', R: 'danger', S: 'info' }
return map[row.status] || 'info'
} }
function handleCreate() { function handleCreate() {
@@ -184,6 +182,15 @@ function handleDisable(row) {
}).catch(() => {}) }).catch(() => {})
} }
function handleEnable(row) {
proxy.$modal.confirm('启用后该套餐将重新参与计费命中,确认启用【' + row.priceSetName + '】?').then(() => {
return enablePriceSet(row.priceSetId)
}).then(() => {
proxy.$modal.msgSuccess('已启用')
tableRef.value.refresh()
}).catch(() => {})
}
function handleCopy(row) { function handleCopy(row) {
copyPriceSet(row.priceSetId).then(res => { copyPriceSet(row.priceSetId).then(res => {
proxy.$modal.msgSuccess('已复制为草稿') proxy.$modal.msgSuccess('已复制为草稿')
@@ -12,7 +12,7 @@ export const SET_TYPE = {
DISCOUNT: 'DISCOUNT' DISCOUNT: 'DISCOUNT'
} }
/** 套餐状态枚举:D 草稿 / A 审核中 / E 生效中 / R 驳回 / S 已停用 */ /** 套餐状态枚举:D 待启用 / A 审核中 / E 生效 / R 驳回 / S 已停用 */
export const SET_STATUS = { export const SET_STATUS = {
DRAFT: 'D', DRAFT: 'D',
AUDIT: 'A', AUDIT: 'A',
@@ -22,9 +22,9 @@ export const SET_STATUS = {
} }
const STATUS_LABEL = { const STATUS_LABEL = {
D: '草稿', D: '待启用',
A: '审核中', A: '审核中',
E: '生效中', E: '生效',
R: '驳回', R: '驳回',
S: '已停用' S: '已停用'
} }
@@ -83,19 +83,21 @@ export function nextVersionNo(versions) {
return 'V' + (max + 1) return 'V' + (max + 1)
} }
/** 状态文案(已过期优先) */ /** Package status label */
export function setStatusLabel(set) { export function setStatusLabel(set) {
if (set && set.expired) return '已过期' if (set && set.expired) return '已过期'
return STATUS_LABEL[set && set.status] || (set && set.status) || '-' if (set && set.status && STATUS_LABEL[set.status]) return STATUS_LABEL[set.status]
return set && set.status ? String(set.status) : '-'
} }
/** 状态标签色(已过期优先) */ /** Package status tag type */
export function setStatusTagType(set) { export function setStatusTagType(set) {
if (set && set.expired) return 'danger' if (set && set.expired) return 'danger'
return STATUS_TAG[set && set.status] || 'info' if (set && set.status && STATUS_TAG[set.status]) return STATUS_TAG[set.status]
return 'info'
} }
/** 明细 / 客户是否可维护:草稿、驳回、生效中 */ /** 明细 / 客户是否可维护:待启用、驳回、生效 */
export function isChildEditable(status) { export function isChildEditable(status) {
return [SET_STATUS.DRAFT, SET_STATUS.REJECT, SET_STATUS.EFFECTIVE].includes(status) return [SET_STATUS.DRAFT, SET_STATUS.REJECT, SET_STATUS.EFFECTIVE].includes(status)
} }