This commit is contained in:
TimSpan 2024-12-19 16:23:18 +08:00
commit c037a3ab53
18 changed files with 264 additions and 94 deletions

View File

@ -9,6 +9,7 @@ type EnumType =
| 'Sex' | 'Sex'
| 'ServiceProjectType' | 'ServiceProjectType'
| 'MiniProgramUserIdentity' | 'MiniProgramUserIdentity'
| 'EducationLevel'
export const initEnum = () => { export const initEnum = () => {
api.get<Record<EnumType, SelectNodeVo<any>[]>>('/common/enums').then(resp => { api.get<Record<EnumType, SelectNodeVo<any>[]>>('/common/enums').then(resp => {

View File

@ -96,10 +96,11 @@
<nut-dialog no-cancel-btn content="详情" v-model:visible="detailVisible"> <nut-dialog no-cancel-btn content="详情" v-model:visible="detailVisible">
<slot> <slot>
<view style="margin-bottom: 5px"> <view style="margin-bottom: 5px">
<view>籍贯{{ securityUserDetail.nativePlace }}</view> <view>籍贯{{ securityUserDetail?.nativePlace }}</view>
<view>公司{{ securityUserDetail.securityUnitName }}</view> <view>公司{{ securityUserDetail?.securityUnitName }}</view>
<view>家庭地址{{ securityUserDetail.homeAddress }}</view> <view>家庭地址{{ securityUserDetail?.homeAddress }}</view>
<view>备注{{ securityUserDetail.remark }}</view> <view>文化程度{{ securityUserDetail.educationLevel?.label }}</view>
<view>备注{{ securityUserDetail?.remark }}</view>
</view> </view>
</slot> </slot>
</nut-dialog> </nut-dialog>
@ -240,7 +241,7 @@ const detail = (item: ServiceProjectSecurityUserPagerVo) => {
} }
const securityUserEdit = (item: ServiceProjectSecurityUserPagerVo) => { const securityUserEdit = (item: ServiceProjectSecurityUserPagerVo) => {
console.log(item) console.log(item)
const params = {...item, sex: item.sex.value} const params = {...item, sex: item.sex.value,educationLevel:item.educationLevel}
Taro.navigateTo({url: `/subPages/projectManager/securityUserForm/securityUserForm?securityUser=${JSON.stringify(params)}&type=formInput`}) Taro.navigateTo({url: `/subPages/projectManager/securityUserForm/securityUserForm?securityUser=${JSON.stringify(params)}&type=formInput`})
} }

View File

@ -38,6 +38,11 @@
<nut-form-item label="手机号" prop="telephone"> <nut-form-item label="手机号" prop="telephone">
<nut-input v-model="formData.telephone" placeholder="请输入手机号" type="text"/> <nut-input v-model="formData.telephone" placeholder="请输入手机号" type="text"/>
</nut-form-item> </nut-form-item>
<nut-form-item label="文化程度" prop="educationLevel">
<view @click="showBottom = true" >
{{educationLevelValue?educationLevelValue:'请选择文化程度'}}
</view>
</nut-form-item>
<nut-form-item label="籍贯" prop="nativePlace"> <nut-form-item label="籍贯" prop="nativePlace">
<nut-input v-model="formData.nativePlace" placeholder="请输入籍贯" type="text"/> <nut-input v-model="formData.nativePlace" placeholder="请输入籍贯" type="text"/>
</nut-form-item> </nut-form-item>
@ -71,12 +76,25 @@
<nut-dialog content="详情" v-model:visible="visible" @ok="onOk" @cancel="cancel"> <nut-dialog content="详情" v-model:visible="visible" @ok="onOk" @cancel="cancel">
<slot> <slot>
<view style="margin-bottom: 5px"> <view style="margin-bottom: 5px">
<view>姓名{{ securityNumberByIdCard.name ? securityNumberByIdCard.name : '无' }}</view> <view>姓名{{ securityNumberByIdCard?.name ? securityNumberByIdCard.name : '无' }}</view>
<view>保安证件号{{ securityNumberByIdCard?.bayzh ? securityNumberByIdCard?.bayzh : '无' }}</view> <view>保安证件号{{ securityNumberByIdCard?.bayzh ? securityNumberByIdCard?.bayzh : '无' }}</view>
<view>身份证{{ securityNumberByIdCard?.sfzhm ? securityNumberByIdCard?.sfzhm : '无' }}</view> <view>身份证{{ securityNumberByIdCard?.sfzhm ? securityNumberByIdCard?.sfzhm : '无' }}</view>
</view> </view>
</slot> </slot>
</nut-dialog> </nut-dialog>
<nut-popup v-model:visible="showBottom" position="bottom" :style="{ height: '40%' }">
<nut-picker
:columns="columns"
:field-names="{
text: 'label',
value: 'value',
children: 'extData'
}"
title="学历选择"
@confirm="confirm"
@cancel="showBottom = false"
/>
</nut-popup>
</view> </view>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
@ -95,6 +113,7 @@ const SEX:any = enumSelectNodes('Sex')
const minioBaseUrl = process.env.TARO_APP_MINIO_URL const minioBaseUrl = process.env.TARO_APP_MINIO_URL
const BUCKET = process.env.TARO_APP_MINIO_BUCKET const BUCKET = process.env.TARO_APP_MINIO_BUCKET
const showPicker = ref(false) const showPicker = ref(false)
const showBottom = ref(false)
const Url = ref('') const Url = ref('')
const type = ref<'formInput' | 'QcCodeInput'>(null!) const type = ref<'formInput' | 'QcCodeInput'>(null!)
const formData = ref<SecurityUserFormParams>({} as any) const formData = ref<SecurityUserFormParams>({} as any)
@ -103,6 +122,8 @@ const visible = ref<boolean>(false)
const securityNumberByIdCard = ref<securityNumberByIdCard | any>() const securityNumberByIdCard = ref<securityNumberByIdCard | any>()
const uploadRef = ref<any>(null) const uploadRef = ref<any>(null)
const modelValue = ref('') const modelValue = ref('')
const columns: any = enumSelectNodes('EducationLevel')
const rules: FormRules = { const rules: FormRules = {
name: [{required: true, message: '请输入姓名'}], name: [{required: true, message: '请输入姓名'}],
@ -115,11 +136,23 @@ const rules: FormRules = {
}, },
], ],
telephone: [{required: true, message: '请输入手机号'}], telephone: [{required: true, message: '请输入手机号'}],
educationLevel:[{required: true, message: '请选择文化程度'}]
} }
const educationLevelValue = ref('')
//
const confirm = ({selectedOptions}) => {
Object.keys(selectedOptions).forEach((item:any,index:number)=>{
console.log(item)
educationLevelValue.value = selectedOptions[index].label
formData.value.educationLevel = selectedOptions[index].value
})
showBottom.value = false
}
useLoad((options) => { useLoad((options) => {
type.value = options.type type.value = options.type
if (type.value === 'QcCodeInput') { if (type.value === 'QcCodeInput') {
console.log(1111)
formData.value = { formData.value = {
name: '', name: '',
serviceProjectId: options.pid, serviceProjectId: options.pid,
@ -130,13 +163,16 @@ useLoad((options) => {
dateOfBirth: null, dateOfBirth: null,
noSecurityNumberDesc: options.noSecurityNumberDesc, noSecurityNumberDesc: options.noSecurityNumberDesc,
photo: '', photo: '',
educationLevel: ''
} }
} else { } else {
const form = JSON.parse(options.securityUser) const form = JSON.parse(options.securityUser)
educationLevelValue.value = form.educationLevel.label
formData.value = Object.assign({}, form, { formData.value = Object.assign({}, form, {
idCard: form.idCard.originalValue, idCard: form.idCard.originalValue,
telephone: form.telephone.originalValue, telephone: form.telephone.originalValue,
photo: form.photo photo: form.photo,
educationLevel: form.educationLevel.value
}) })
} }
}) })
@ -244,6 +280,7 @@ const submit = () => {
} else { } else {
url = '/mp/user/qrCodeFormInputSecurityUser' url = '/mp/user/qrCodeFormInputSecurityUser'
} }
console.log(formData.value)
const resp = await api.post(url, formData.value) const resp = await api.post(url, formData.value)
Taro.showToast({ Taro.showToast({
title: resp.message, title: resp.message,
@ -267,7 +304,9 @@ const submit = () => {
homeAddress: '', homeAddress: '',
noSecurityNumberDesc: '', noSecurityNumberDesc: '',
photo: '', photo: '',
educationLevel: ''
} }
educationLevelValue.value = ''
uploadRef.value?.clearUploadQueue() uploadRef.value?.clearUploadQueue()
} }
}) })

View File

@ -62,5 +62,9 @@ export interface ServiceProjectSecurityUserPagerVo {
snowFlakeId: string; snowFlakeId: string;
workPost?: string; workPost?: string;
sex: BaseEnum<number> sex: BaseEnum<number>
educationLevel:{
label:string,
value:string
}
} }

View File

@ -13,7 +13,8 @@ export interface SecurityUserFormParams {
photo?:string; photo?:string;
remark?: string; remark?: string;
noSecurityNumberDesc:string; noSecurityNumberDesc:string;
homeAddress?: string homeAddress?: string;
educationLevel:string
} }
export interface value{ export interface value{

View File

@ -0,0 +1,25 @@
package com.changhu.common.db.enums;
import com.baomidou.mybatisplus.annotation.IEnum;
import com.changhu.common.db.BaseEnum;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* @author 20252
* @createTime 2024/12/19 上午9:31
* @desc EducationLevel...
*/
@Getter
@AllArgsConstructor
public enum EducationLevel implements BaseEnum<String>, IEnum<String> {
PRIMARY_SCHOOL("primary_school", "小学"),
JUNIOR_SCHOOL("junior_school", "初中"),
HIGH_SCHOOL("high_school", "高中"),
COLLEGE("college", "大专"),
UNDERGRADUATE("undergraduate", "本科"),
UNDERGRADUATE_MORE("undergraduate_more", "本科以上"),
;
private final String value;
private final String label;
}

View File

@ -68,4 +68,11 @@ public class OpenController {
return openApiService.securityUserRoster(id, type); return openApiService.securityUserRoster(id, type);
} }
@Operation(summary = "单位下的安保人员花名册")
@GetMapping("/unitSecurityUserRoster")
public List<SecurityUserRosterDTO> unitSecurityUserRoster(@Schema(description = "代码") @RequestParam String code,
@Schema(description = "等级") @RequestParam Integer level) {
return openApiService.unitSecurityUserRoster(code, level);
}
} }

View File

@ -51,4 +51,9 @@ public interface OpenApiMapper {
*/ */
List<SecurityUserRosterDTO> securityUserRoster(@Param("id") Long id, List<SecurityUserRosterDTO> securityUserRoster(@Param("id") Long id,
@Param("type") EnterprisesUnitOrServiceProjectType type); @Param("type") EnterprisesUnitOrServiceProjectType type);
/**
* 单位下的服务人员花名册
*/
List<SecurityUserRosterDTO> unitSecurityUserRoster(String code, Integer level);
} }

View File

@ -1,5 +1,6 @@
package com.changhu.module.miniProgram.pojo.params; package com.changhu.module.miniProgram.pojo.params;
import com.changhu.common.db.enums.EducationLevel;
import com.changhu.common.db.enums.Sex; import com.changhu.common.db.enums.Sex;
import com.changhu.common.validator.annotation.IdCard; import com.changhu.common.validator.annotation.IdCard;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
@ -66,4 +67,8 @@ public class SecurityUserSaveOrUpdateParams {
@Schema(description = "备注") @Schema(description = "备注")
private String remark; private String remark;
@NotNull(message = "文化程度为必选")
@Schema(description = "文化程度")
private EducationLevel educationLevel;
} }

View File

@ -2,6 +2,7 @@ package com.changhu.module.miniProgram.pojo.vo;
import cn.hutool.core.util.DesensitizedUtil; import cn.hutool.core.util.DesensitizedUtil;
import com.changhu.common.annotation.Desensitized; import com.changhu.common.annotation.Desensitized;
import com.changhu.common.db.enums.EducationLevel;
import com.changhu.common.db.enums.Sex; import com.changhu.common.db.enums.Sex;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data; import lombok.Data;
@ -63,6 +64,9 @@ public class ServiceProjectSecurityUserPagerVo {
@Schema(description = "备注") @Schema(description = "备注")
private String remark; private String remark;
@Schema(description = "文化程度")
private EducationLevel educationLevel;
@Schema(description = "创建时间") @Schema(description = "创建时间")
private LocalDateTime createTime; private LocalDateTime createTime;
} }

View File

@ -43,6 +43,8 @@ public class SecurityUnitUseStatisticsDTO {
@Schema(description = "公安单位id") @Schema(description = "公安单位id")
private Long policeUnitId; private Long policeUnitId;
@Schema(description = "公安代为代码")
private String policeUnitCode;
@Schema(description = "公安单位名称") @Schema(description = "公安单位名称")
private String policeUnitName; private String policeUnitName;

View File

@ -1,8 +1,11 @@
package com.changhu.pojo.dto; package com.changhu.pojo.dto;
import cn.hutool.core.util.DesensitizedUtil; import cn.hutool.core.util.DesensitizedUtil;
import com.alibaba.fastjson2.annotation.JSONField;
import com.changhu.common.annotation.Desensitized; import com.changhu.common.annotation.Desensitized;
import com.changhu.common.db.enums.EducationLevel;
import com.changhu.common.db.enums.Sex; import com.changhu.common.db.enums.Sex;
import com.changhu.support.fastjson2.serializer.MinioPrefixSerializer;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data; import lombok.Data;
@ -15,6 +18,9 @@ import lombok.Data;
public class SecurityUserRosterDTO { public class SecurityUserRosterDTO {
@Schema(description = "id") @Schema(description = "id")
private Long snowFlakeId; private Long snowFlakeId;
@Schema(description = "照片")
@JSONField(serializeUsing = MinioPrefixSerializer.class)
private String photo;
@Schema(description = "名称") @Schema(description = "名称")
private String name; private String name;
@Schema(description = "性别") @Schema(description = "性别")
@ -33,4 +39,6 @@ public class SecurityUserRosterDTO {
private String securityUnitName; private String securityUnitName;
@Schema(description = "保安证号") @Schema(description = "保安证号")
private String securityNumber; private String securityNumber;
@Schema(description = "文化程度")
private EducationLevel educationLevel;
} }

View File

@ -1,6 +1,7 @@
package com.changhu.pojo.dto; package com.changhu.pojo.dto;
import com.alibaba.fastjson2.annotation.JSONField; import com.alibaba.fastjson2.annotation.JSONField;
import com.changhu.common.db.enums.EducationLevel;
import com.changhu.common.db.enums.ServiceProjectType; import com.changhu.common.db.enums.ServiceProjectType;
import com.changhu.common.db.enums.Sex; import com.changhu.common.db.enums.Sex;
import com.changhu.pojo.model.LegalPersonInfo; import com.changhu.pojo.model.LegalPersonInfo;
@ -81,6 +82,9 @@ public class ServiceProjectDTO {
static class SecurityUserInfo { static class SecurityUserInfo {
@Schema(description = "id") @Schema(description = "id")
private Long snowFlakeId; private Long snowFlakeId;
@JSONField(serializeUsing = MinioPrefixSerializer.class)
@Schema(description = "照片")
private String photo;
@Schema(description = "名字") @Schema(description = "名字")
private String name; private String name;
@Schema(description = "手机号") @Schema(description = "手机号")
@ -103,5 +107,7 @@ public class ServiceProjectDTO {
private String remark; private String remark;
@Schema(description = "创建时间") @Schema(description = "创建时间")
private String createTime; private String createTime;
@Schema(description = "文化程度")
private EducationLevel educationLevel;
} }
} }

View File

@ -1,6 +1,7 @@
package com.changhu.pojo.entity; package com.changhu.pojo.entity;
import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.TableName;
import com.changhu.common.db.enums.EducationLevel;
import com.changhu.common.db.enums.Sex; import com.changhu.common.db.enums.Sex;
import com.changhu.support.mybatisplus.pojo.entity.BaseEntity; import com.changhu.support.mybatisplus.pojo.entity.BaseEntity;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
@ -99,5 +100,9 @@ public class SecurityUser extends BaseEntity implements Serializable {
*/ */
private String remark; private String remark;
/**
* 文化程度
*/
private EducationLevel educationLevel;
} }

View File

@ -56,4 +56,9 @@ public interface OpenApiService {
* @return 花名册 * @return 花名册
*/ */
List<SecurityUserRosterDTO> securityUserRoster(Long id, EnterprisesUnitOrServiceProjectType type); List<SecurityUserRosterDTO> securityUserRoster(Long id, EnterprisesUnitOrServiceProjectType type);
/**
* 单位下的安保人员花名册
*/
List<SecurityUserRosterDTO> unitSecurityUserRoster(String code, Integer level);
} }

View File

@ -123,4 +123,10 @@ public class OpenApiServiceImpl implements OpenApiService {
public List<SecurityUserRosterDTO> securityUserRoster(Long id, EnterprisesUnitOrServiceProjectType type) { public List<SecurityUserRosterDTO> securityUserRoster(Long id, EnterprisesUnitOrServiceProjectType type) {
return openApiMapper.securityUserRoster(id, type); return openApiMapper.securityUserRoster(id, type);
} }
@Override
public List<SecurityUserRosterDTO> unitSecurityUserRoster(String code, Integer level) {
return openApiMapper.unitSecurityUserRoster(code, level);
}
} }

View File

@ -1,5 +1,6 @@
package com.changhu.support.fastjson2.serializer; package com.changhu.support.fastjson2.serializer;
import cn.hutool.core.util.StrUtil;
import cn.hutool.extra.spring.SpringUtil; import cn.hutool.extra.spring.SpringUtil;
import com.alibaba.fastjson2.JSONWriter; import com.alibaba.fastjson2.JSONWriter;
import com.alibaba.fastjson2.writer.ObjectWriter; import com.alibaba.fastjson2.writer.ObjectWriter;
@ -22,6 +23,9 @@ public class MinioPrefixSerializer implements ObjectWriter<String> {
@Override @Override
public void write(JSONWriter jsonWriter, Object object, Object fieldName, Type fieldType, long features) { public void write(JSONWriter jsonWriter, Object object, Object fieldName, Type fieldType, long features) {
if (object instanceof String path && StrUtil.isNotEmpty(path)) {
jsonWriter.writeString(minioPrefix + object); jsonWriter.writeString(minioPrefix + object);
} }
jsonWriter.writeNull();
}
} }

View File

@ -43,9 +43,10 @@
property="securityUserList" /> property="securityUserList" />
</resultMap> </resultMap>
<select id="getServiceProjectByEnterprisesUnitId" resultMap="ServiceProjectDTOResultMap"> <select id="getServiceProjectByEnterprisesUnitId" resultMap="ServiceProjectDTOResultMap">
SELECT SELECT sp.*,
sp.*, IF(mpu.snow_flake_id IS NOT NULL,
IF(mpu.snow_flake_id IS NOT NULL,json_object( 'name', mpu.NAME, 'sex', mpu.sex, 'telephone', mpu.telephone, 'idCard', mpu.id_card ),NULL) AS 'projectManagerInfo', json_object('name', mpu.NAME, 'sex', mpu.sex, 'telephone', mpu.telephone, 'idCard', mpu.id_card),
NULL) AS 'projectManagerInfo',
json_object( json_object(
'name', su1.name, 'name', su1.name,
'socialCode', su1.social_code, 'socialCode', su1.social_code,
@ -56,6 +57,7 @@
) as 'securityUnitInfo', ) as 'securityUnitInfo',
if(COUNT(su.snow_flake_id) > 0, JSON_ARRAYAGG(json_object( if(COUNT(su.snow_flake_id) > 0, JSON_ARRAYAGG(json_object(
'snowFlakeId', su.snow_flake_id, 'snowFlakeId', su.snow_flake_id,
'photo', su.photo,
'name', su.name, 'name', su.name,
'telephone', su.telephone, 'telephone', su.telephone,
'workPost', su.work_post, 'workPost', su.work_post,
@ -66,19 +68,18 @@
'securityNumber', su.security_number, 'securityNumber', su.security_number,
'homeAddress', su.home_address, 'homeAddress', su.home_address,
'remark', su.remark, 'remark', su.remark,
'educationLevel', su.education_level,
'createTime', su.create_time 'createTime', su.create_time
)), JSON_ARRAY()) as 'securityUserList' )), JSON_ARRAY()) as 'securityUserList'
FROM FROM service_project sp
service_project sp
left join security_unit su1 on sp.security_unit_id = su1.snow_flake_id left join security_unit su1 on sp.security_unit_id = su1.snow_flake_id
LEFT JOIN mini_program_user mpu ON sp.project_manager_mini_program_user_id = mpu.snow_flake_id AND mpu.identity = 'project_manager' LEFT JOIN mini_program_user mpu ON sp.project_manager_mini_program_user_id = mpu.snow_flake_id AND
mpu.identity = 'project_manager'
left join security_user su on su.service_project_id = sp.snow_flake_id and su.delete_flag = 0 left join security_user su on su.service_project_id = sp.snow_flake_id and su.delete_flag = 0
WHERE WHERE sp.delete_flag = 0
sp.delete_flag = 0
AND sp.enterprises_unit_id = #{enterprisesUnitId} AND sp.enterprises_unit_id = #{enterprisesUnitId}
group by sp.snow_flake_id group by sp.snow_flake_id
ORDER BY ORDER BY sp.create_time DESC
sp.create_time DESC
</select> </select>
<resultMap id="SecurityUnitUseStatisticsDTOResultMap" type="com.changhu.pojo.dto.SecurityUnitUseStatisticsDTO"> <resultMap id="SecurityUnitUseStatisticsDTOResultMap" type="com.changhu.pojo.dto.SecurityUnitUseStatisticsDTO">
<result <result
@ -109,6 +110,7 @@
ad4.name as 'streetName', ad4.name as 'streetName',
eu.address as 'address', eu.address as 'address',
pu.snow_flake_id as 'policeUnitId', pu.snow_flake_id as 'policeUnitId',
pu.code as 'policeUnitCode',
pu.name as 'policeUnitName', pu.name as 'policeUnitName',
json_arrayagg( json_arrayagg(
json_object( json_object(
@ -166,9 +168,11 @@
select su.snow_flake_id, select su.snow_flake_id,
su.name, su.name,
su.sex, su.sex,
su.photo,
TIMESTAMPDIFF(YEAR, su.date_of_birth, CURDATE()) AS 'age', TIMESTAMPDIFF(YEAR, su.date_of_birth, CURDATE()) AS 'age',
su.id_card, su.id_card,
su.telephone, su.telephone,
su.education_level,
eu.name as 'enterprisesUnitName', eu.name as 'enterprisesUnitName',
suu.name as 'securityUnitName', suu.name as 'securityUnitName',
su.security_number su.security_number
@ -190,4 +194,42 @@
</choose> </choose>
order by su.create_time desc order by su.create_time desc
</select> </select>
<select id="unitSecurityUserRoster" resultType="com.changhu.pojo.dto.SecurityUserRosterDTO">
select su.snow_flake_id,
su.name,
su.sex,
su.photo,
TIMESTAMPDIFF(YEAR, su.date_of_birth, CURDATE()) AS 'age',
su.id_card,
su.telephone,
su.education_level,
eu.name as 'enterprisesUnitName',
suu.name as 'securityUnitName',
su.security_number
from enterprises_unit eu
LEFT join police_unit pu on eu.police_unit_id = pu.snow_flake_id and pu.delete_flag = 0
LEFT JOIN service_project sp ON sp.enterprises_unit_id = eu.snow_flake_id AND sp.delete_flag = 0
JOIN security_user su ON su.service_project_id = sp.snow_flake_id AND su.delete_flag = 0
LEFT JOIN security_unit suu ON su.security_unit_id = suu.snow_flake_id AND suu.delete_flag = 0
where eu.delete_flag = 0
<choose>
<when test="level==1">
and eu.province = #{code}
</when>
<when test="level==2">
and eu.city = #{code}
</when>
<when test="level==3">
and eu.districts = #{code}
</when>
<when test="level==4">
and eu.street = #{code}
</when>
<when test="level==5">
and pu.code = #{code}
</when>
<otherwise>and eu.snow_flake_id = -1</otherwise>
</choose>
order by su.create_time desc
</select>
</mapper> </mapper>