|
|
@@ -28,6 +28,8 @@ export namespace PrescriptionReviewModel {
|
|
|
source: ReviewIndicatorSource;
|
|
|
/** 分类下点评项数量 */
|
|
|
indicatorCount?: number;
|
|
|
+ sortNo?: number;
|
|
|
+ remark?: string;
|
|
|
}
|
|
|
|
|
|
export interface ReviewIndicator extends TransformRecord {
|
|
|
@@ -274,6 +276,72 @@ export function updateReviewCostLimitMethod(dictValue: string) {
|
|
|
});
|
|
|
}
|
|
|
|
|
|
+const COMMENT_CATEGORY_BASE = '/manager/tcmp-pc/commentCategory';
|
|
|
+
|
|
|
+function toCommentCategoryRecordId(id?: unknown): string {
|
|
|
+ if (id === undefined || id === null) return '';
|
|
|
+ return String(id);
|
|
|
+}
|
|
|
+
|
|
|
+function normalizeCommentList(data: unknown): TransformData[] {
|
|
|
+ if (Array.isArray(data)) return data;
|
|
|
+ if (data && typeof data === 'object') {
|
|
|
+ const record = data as TransformData;
|
|
|
+ if (Array.isArray(record.rows)) return record.rows;
|
|
|
+ if (Array.isArray(record.list)) return record.list;
|
|
|
+ if (Array.isArray(record.items)) return record.items;
|
|
|
+ if (Array.isArray(record.data)) return record.data;
|
|
|
+ }
|
|
|
+ return [];
|
|
|
+}
|
|
|
+
|
|
|
+function fromCommentIndicator(
|
|
|
+ data: TransformData,
|
|
|
+ categoryId: string,
|
|
|
+ categoryName = '',
|
|
|
+): PrescriptionReviewModel.ReviewIndicator {
|
|
|
+ const id = toCommentCategoryRecordId(data?.id);
|
|
|
+ const isSystem = String(data?.isSystem ?? '');
|
|
|
+ const statusValue = data?.status;
|
|
|
+ return {
|
|
|
+ id,
|
|
|
+ categoryId,
|
|
|
+ categoryName,
|
|
|
+ name: String(data?.classifyName ?? data?.commentName ?? data?.name ?? ''),
|
|
|
+ source: isSystem === '0' ? 'system' : 'custom',
|
|
|
+ associatedChineseMedicine: String(data?.associatedChineseMedicine ?? '0') === '1',
|
|
|
+ remark: data?.remark ?? undefined,
|
|
|
+ status:
|
|
|
+ statusValue === undefined || statusValue === null
|
|
|
+ ? 1
|
|
|
+ : Number(statusValue) === 0
|
|
|
+ ? 0
|
|
|
+ : 1,
|
|
|
+ createUser: data?.createBy ?? undefined,
|
|
|
+ createTime: data?.createTime ?? undefined,
|
|
|
+ updateUser: data?.updateBy ?? undefined,
|
|
|
+ updateTime: data?.updateTime ?? undefined,
|
|
|
+ };
|
|
|
+}
|
|
|
+
|
|
|
+function fromCommentCategory(
|
|
|
+ data: TransformData,
|
|
|
+): PrescriptionReviewModel.ReviewIndicatorCategory {
|
|
|
+ const id = toCommentCategoryRecordId(data?.id);
|
|
|
+ const isSystem = String(data?.isSystem ?? '');
|
|
|
+ return {
|
|
|
+ id,
|
|
|
+ name: String(data?.classifyName ?? ''),
|
|
|
+ source: isSystem === '0' ? 'system' : 'custom',
|
|
|
+ sortNo: Number(data?.sortNo ?? 0),
|
|
|
+ remark: data?.remark ?? undefined,
|
|
|
+ createUser: data?.createBy ?? undefined,
|
|
|
+ createTime: data?.createTime ?? undefined,
|
|
|
+ updateUser: data?.updateBy ?? undefined,
|
|
|
+ updateTime: data?.updateTime ?? undefined,
|
|
|
+ };
|
|
|
+}
|
|
|
+
|
|
|
const MOCK_INDICATOR_CATEGORIES: PrescriptionReviewModel.ReviewIndicatorCategory[] =
|
|
|
[
|
|
|
{ id: 'cat-1', name: '适应症', source: 'system' },
|
|
|
@@ -511,15 +579,28 @@ function withCategoryIndicatorCount(
|
|
|
}));
|
|
|
}
|
|
|
|
|
|
-function getNextCustomCategoryName() {
|
|
|
- const prefix = '新加分类';
|
|
|
- let index = 1;
|
|
|
- while (
|
|
|
- MOCK_INDICATOR_CATEGORIES.some((item) => item.name === `${prefix}${index}`)
|
|
|
- ) {
|
|
|
- index += 1;
|
|
|
- }
|
|
|
- return `${prefix}${index}`;
|
|
|
+function toCommentCategoryAddPayload(
|
|
|
+ classifyName: string,
|
|
|
+ sortNo = 0,
|
|
|
+): TransformData {
|
|
|
+ return {
|
|
|
+ classifyName,
|
|
|
+ isSystem: '1',
|
|
|
+ sortNo,
|
|
|
+ del: '0',
|
|
|
+ };
|
|
|
+}
|
|
|
+
|
|
|
+function toCommentCategoryUpdatePayload(
|
|
|
+ id: string,
|
|
|
+ classifyName: string,
|
|
|
+ sortNo = 0,
|
|
|
+): TransformData {
|
|
|
+ return {
|
|
|
+ id: toCommentCategoryRecordId(id),
|
|
|
+ classifyName,
|
|
|
+ sortNo,
|
|
|
+ };
|
|
|
}
|
|
|
|
|
|
function syncIndicatorCategoryName(
|
|
|
@@ -548,121 +629,131 @@ function filterIndicators(
|
|
|
return result;
|
|
|
}
|
|
|
|
|
|
-/** 点评指标分类列表(当前为本地 mock) */
|
|
|
-export function listReviewIndicatorCategoriesMethod(): Promise<
|
|
|
+/** 点评指标分类列表 */
|
|
|
+export async function listReviewIndicatorCategoriesMethod(): Promise<
|
|
|
PrescriptionReviewModel.ReviewIndicatorCategory[]
|
|
|
> {
|
|
|
- return Promise.resolve(withCategoryIndicatorCount([...MOCK_INDICATOR_CATEGORIES]));
|
|
|
+ const result = await http.get<
|
|
|
+ TransformList<PrescriptionReviewModel.ReviewIndicatorCategory>,
|
|
|
+ TransformList
|
|
|
+ >(`${COMMENT_CATEGORY_BASE}/pageList`, {
|
|
|
+ params: {
|
|
|
+ pageNum: 1,
|
|
|
+ pageSize: 999,
|
|
|
+ },
|
|
|
+ cacheFor: 0,
|
|
|
+ transform({ items, ...data }) {
|
|
|
+ const rows = items ?? [];
|
|
|
+ return {
|
|
|
+ ...data,
|
|
|
+ items: rows
|
|
|
+ .map((item) => fromCommentCategory(item))
|
|
|
+ .sort((a, b) => (a.sortNo ?? 0) - (b.sortNo ?? 0)),
|
|
|
+ };
|
|
|
+ },
|
|
|
+ });
|
|
|
+ return result.items;
|
|
|
}
|
|
|
|
|
|
-/** 新增点评指标分类(当前为本地 mock) */
|
|
|
-export function createReviewIndicatorCategoryMethod(name?: string) {
|
|
|
- const trimmed = (name ?? getNextCustomCategoryName()).trim();
|
|
|
+/** 新增点评指标分类 */
|
|
|
+export async function createReviewIndicatorCategoryMethod(name: string) {
|
|
|
+ const trimmed = name.trim();
|
|
|
if (!trimmed) {
|
|
|
- return Promise.reject(new Error('分类名称不能为空'));
|
|
|
+ throw new Error('分类名称不能为空');
|
|
|
}
|
|
|
- if (MOCK_INDICATOR_CATEGORIES.some((item) => item.name === trimmed)) {
|
|
|
- return Promise.reject(new Error('分类名称已存在'));
|
|
|
+ const categories = await listReviewIndicatorCategoriesMethod();
|
|
|
+ if (categories.some((item) => item.name === trimmed)) {
|
|
|
+ throw new Error('分类名称已存在');
|
|
|
}
|
|
|
- const category: PrescriptionReviewModel.ReviewIndicatorCategory = {
|
|
|
- id: `cat-${Date.now()}`,
|
|
|
- name: trimmed,
|
|
|
- source: 'custom',
|
|
|
- indicatorCount: 0,
|
|
|
- };
|
|
|
- MOCK_INDICATOR_CATEGORIES.push(category);
|
|
|
- return Promise.resolve(category);
|
|
|
+ const sortNo =
|
|
|
+ categories.reduce((max, item) => Math.max(max, item.sortNo ?? 0), -1) + 1;
|
|
|
+ const result = await http.post<TransformData, TransformData>(
|
|
|
+ `${COMMENT_CATEGORY_BASE}/add`,
|
|
|
+ toCommentCategoryAddPayload(trimmed, sortNo),
|
|
|
+ { cacheFor: 0 },
|
|
|
+ );
|
|
|
+ return fromCommentCategory({
|
|
|
+ ...toCommentCategoryAddPayload(trimmed, sortNo),
|
|
|
+ ...(result ?? {}),
|
|
|
+ classifyName: trimmed,
|
|
|
+ });
|
|
|
}
|
|
|
|
|
|
-/** 更新点评指标分类名称(当前为本地 mock,系统内置不可改) */
|
|
|
-export function updateReviewIndicatorCategoryMethod(
|
|
|
+/** 更新点评指标分类 */
|
|
|
+export async function updateReviewIndicatorCategoryMethod(
|
|
|
categoryId: string,
|
|
|
- { name }: { name: string },
|
|
|
+ { name, sortNo = 0 }: { name: string; sortNo?: number },
|
|
|
) {
|
|
|
- const category = MOCK_INDICATOR_CATEGORIES.find((item) => item.id === categoryId);
|
|
|
- if (!category) {
|
|
|
- return Promise.reject(new Error('分类不存在'));
|
|
|
- }
|
|
|
- if (category.source === 'system') {
|
|
|
- return Promise.reject(new Error('系统内置分类不可修改'));
|
|
|
- }
|
|
|
const trimmed = name.trim();
|
|
|
if (!trimmed) {
|
|
|
- return Promise.reject(new Error('分类名称不能为空'));
|
|
|
- }
|
|
|
- if (
|
|
|
- MOCK_INDICATOR_CATEGORIES.some(
|
|
|
- (item) => item.id !== categoryId && item.name === trimmed,
|
|
|
- )
|
|
|
- ) {
|
|
|
- return Promise.reject(new Error('分类名称已存在'));
|
|
|
+ throw new Error('分类名称不能为空');
|
|
|
}
|
|
|
- category.name = trimmed;
|
|
|
- MOCK_INDICATORS.forEach((item) => {
|
|
|
- if (item.categoryId === categoryId) {
|
|
|
- item.categoryName = trimmed;
|
|
|
- }
|
|
|
- });
|
|
|
- return Promise.resolve({
|
|
|
- ...category,
|
|
|
- indicatorCount: getCategoryIndicatorCount(categoryId),
|
|
|
+ const payload = toCommentCategoryUpdatePayload(categoryId, trimmed, sortNo);
|
|
|
+ const result = await http.post<TransformData, TransformData>(
|
|
|
+ `${COMMENT_CATEGORY_BASE}/update`,
|
|
|
+ payload,
|
|
|
+ { cacheFor: 0 },
|
|
|
+ );
|
|
|
+ return fromCommentCategory({
|
|
|
+ ...payload,
|
|
|
+ ...(result ?? {}),
|
|
|
+ classifyName: trimmed,
|
|
|
});
|
|
|
}
|
|
|
|
|
|
-/** 点评指标分类排序(当前为本地 mock) */
|
|
|
-export function sortReviewIndicatorCategoriesMethod(orderedIds: string[]) {
|
|
|
- if (orderedIds.length !== MOCK_INDICATOR_CATEGORIES.length) {
|
|
|
- return Promise.reject(new Error('分类排序数据不完整'));
|
|
|
+/** 点评指标分类排序(交换两条记录的 sortNo) */
|
|
|
+export async function sortReviewIndicatorCategoriesMethod(
|
|
|
+ updates: Array<{ id: string; sortNo: number }>,
|
|
|
+) {
|
|
|
+ if (!updates.length) {
|
|
|
+ return;
|
|
|
}
|
|
|
- const categoryMap = new Map(
|
|
|
- MOCK_INDICATOR_CATEGORIES.map((item) => [item.id, item]),
|
|
|
+ await Promise.all(
|
|
|
+ updates.map(({ id, sortNo }) =>
|
|
|
+ http.post<void, unknown>(
|
|
|
+ `${COMMENT_CATEGORY_BASE}/update`,
|
|
|
+ {
|
|
|
+ id: toCommentCategoryRecordId(id),
|
|
|
+ sortNo,
|
|
|
+ },
|
|
|
+ { cacheFor: 0 },
|
|
|
+ ),
|
|
|
+ ),
|
|
|
);
|
|
|
- const sorted = orderedIds.map((id) => categoryMap.get(id)).filter(Boolean) as
|
|
|
- PrescriptionReviewModel.ReviewIndicatorCategory[];
|
|
|
- if (sorted.length !== MOCK_INDICATOR_CATEGORIES.length) {
|
|
|
- return Promise.reject(new Error('分类排序数据无效'));
|
|
|
- }
|
|
|
- MOCK_INDICATOR_CATEGORIES.splice(0, MOCK_INDICATOR_CATEGORIES.length, ...sorted);
|
|
|
- return Promise.resolve(withCategoryIndicatorCount([...MOCK_INDICATOR_CATEGORIES]));
|
|
|
}
|
|
|
|
|
|
-/** 删除点评指标分类(当前为本地 mock,系统内置不可删) */
|
|
|
+/** 删除点评指标分类 */
|
|
|
export function deleteReviewIndicatorCategoryMethod(categoryId: string) {
|
|
|
- const index = MOCK_INDICATOR_CATEGORIES.findIndex(
|
|
|
- (item) => item.id === categoryId,
|
|
|
- );
|
|
|
- if (index === -1) {
|
|
|
- return Promise.reject(new Error('分类不存在'));
|
|
|
- }
|
|
|
- const category = MOCK_INDICATOR_CATEGORIES[index];
|
|
|
- if (!category) {
|
|
|
- return Promise.reject(new Error('分类不存在'));
|
|
|
- }
|
|
|
- if (category.source === 'system') {
|
|
|
- return Promise.reject(new Error('系统内置分类不可删除'));
|
|
|
- }
|
|
|
- const inUse = MOCK_INDICATORS.some((item) => item.categoryId === categoryId);
|
|
|
- if (inUse) {
|
|
|
- return Promise.reject(new Error('该分类下存在点评项,无法删除'));
|
|
|
- }
|
|
|
- MOCK_INDICATOR_CATEGORIES.splice(index, 1);
|
|
|
- return Promise.resolve(true);
|
|
|
+ return http.post<void, unknown>(`${COMMENT_CATEGORY_BASE}/delete`, void 0, {
|
|
|
+ params: { id: toCommentCategoryRecordId(categoryId) },
|
|
|
+ cacheFor: 0,
|
|
|
+ });
|
|
|
}
|
|
|
|
|
|
-/** 按分类获取点评指标列表(当前为本地 mock) */
|
|
|
-export function listReviewIndicatorsByCategoryMethod(
|
|
|
+/** 按分类获取点评指标列表 */
|
|
|
+export async function listReviewIndicatorsByCategoryMethod(
|
|
|
categoryId: string,
|
|
|
- options?: { enabledOnly?: boolean },
|
|
|
+ options?: { enabledOnly?: boolean; categoryName?: string },
|
|
|
) {
|
|
|
- const category = MOCK_INDICATOR_CATEGORIES.find((item) => item.id === categoryId);
|
|
|
- if (!category) {
|
|
|
- return Promise.reject(new Error('分类不存在'));
|
|
|
- }
|
|
|
- let items = MOCK_INDICATORS.filter((item) => item.categoryId === categoryId);
|
|
|
+ const items = await http.get<
|
|
|
+ PrescriptionReviewModel.ReviewIndicator[],
|
|
|
+ TransformData[]
|
|
|
+ >(`${COMMENT_CATEGORY_BASE}/list`, {
|
|
|
+ params: { categoryId: toCommentCategoryRecordId(categoryId) },
|
|
|
+ cacheFor: 0,
|
|
|
+ transform(data) {
|
|
|
+ return normalizeCommentList(data)
|
|
|
+ .sort((a, b) => Number(a.sortNo ?? 0) - Number(b.sortNo ?? 0))
|
|
|
+ .map((item) =>
|
|
|
+ fromCommentIndicator(item, categoryId, options?.categoryName ?? ''),
|
|
|
+ );
|
|
|
+ },
|
|
|
+ });
|
|
|
+
|
|
|
if (options?.enabledOnly) {
|
|
|
- items = items.filter((item) => item.status === 1);
|
|
|
+ return items.filter((item) => item.status === 1);
|
|
|
}
|
|
|
- return Promise.resolve(items);
|
|
|
+ return items;
|
|
|
}
|
|
|
|
|
|
/** 点评指标排序(当前为本地 mock,按分类内顺序) */
|