Merge remote-tracking branch 'origin/main'

This commit is contained in:
wangyilin 2024-12-24 13:40:23 +08:00
commit a46d6e2f24
6 changed files with 130 additions and 58 deletions

View File

@ -40,12 +40,15 @@
/> />
<a-radio-group v-else-if="item.type === 'radioGroup'" v-model:value="modelValue[field]" style="width: 100%" v-bind="item.componentsProps" :options="item.options" /> <a-radio-group v-else-if="item.type === 'radioGroup'" v-model:value="modelValue[field]" style="width: 100%" v-bind="item.componentsProps" :options="item.options" />
<a-checkbox-group v-else-if="item.type === 'checkboxGroup'" v-model:value="modelValue[field]" style="width: 100%" v-bind="item.componentsProps" :options="item.options" /> <a-checkbox-group v-else-if="item.type === 'checkboxGroup'" v-model:value="modelValue[field]" style="width: 100%" v-bind="item.componentsProps" :options="item.options" />
<!-- :show-search="item.showSearch" -->
<!-- :placeholder="getPlaceholder(item)" -->
<!-- :placeholder="item.placeholder" -->
<a-select <a-select
v-else-if="item.type === 'select'" v-else-if="item.type === 'select'"
v-model:value="modelValue[field]" v-model:value="modelValue[field]"
style="width: 100%" style="width: 100%"
:placeholder="item.placeholder"
v-bind="item.componentsProps" v-bind="item.componentsProps"
:placeholder="getPlaceholder(item)"
:allowClear="item.componentsProps?.allowClear ?? true" :allowClear="item.componentsProps?.allowClear ?? true"
:options="item.options" :options="item.options"
/> />
@ -162,7 +165,13 @@ const getResponsive = (item: FormProMaxItemProps): Grid => {
} }
//: =formItem=label //: =formItem=label
const getPlaceholder = (item: FormProMaxItemProps) => item.componentsProps?.placeholder ?? item.placeholder ?? (item.type.includes('input') ? `请输入${item.label}` : `请选择${item.label}`) const getPlaceholder = function (item: FormProMaxItemProps) {
// console.log('getPlaceholder____________________________', item)
// console.log('getPlaceholder_______________________placeholder', item.placeholder)
// console.log(item.componentsProps?.placeholder ?? item.placeholder ?? (item.type.includes('input') ? `${item.label}` : `${item.label}`))
return item.componentsProps?.placeholder ?? item.placeholder ?? (item.type.includes('input') ? `请输入${item.label}` : `请选择${item.label}`)
}
defineExpose<FormExpose>({ defineExpose<FormExpose>({
validate: (nameList, options) => formProMaxRef.value?.validate(nameList, options), validate: (nameList, options) => formProMaxRef.value?.validate(nameList, options),

View File

@ -17,9 +17,9 @@
</a-space> </a-space>
</template> </template>
</TableProMax> </TableProMax>
<a-modal v-model:open="visible" :title="serviceTitle" @ok="submit" @cancel="closeModal"> <!-- <a-modal v-model:open="visible" :title="serviceTitle" @ok="submit" @cancel="closeModal">
<FormProMax ref="formRef" v-model:value="formParams" :form-item-options="formItemOptions" /> <FormProMax ref="formRef" v-model:value="formParams" :form-item-options="formItemOptions" />
</a-modal> </a-modal> -->
</div> </div>
</template> </template>
@ -31,7 +31,8 @@ import { AutoComplete, Button, Input, message, Modal, Space } from 'ant-design-v
import { debounce } from 'lodash-es' import { debounce } from 'lodash-es'
import FormProMax from '@/components/form/FormProMax.vue' import FormProMax from '@/components/form/FormProMax.vue'
import api from '@/axios' import api from '@/axios'
import { ref, reactive, computed, onMounted } from 'vue' // createVNode
import { ref, reactive, computed, onMounted, createVNode } from 'vue'
import TableProMax from '@/components/table/TableProMax.vue' import TableProMax from '@/components/table/TableProMax.vue'
import { TableProMaxProps } from '@/types/components/table/index.ts' import { TableProMaxProps } from '@/types/components/table/index.ts'
import { ComponentExposed } from 'vue-component-type-helpers' import { ComponentExposed } from 'vue-component-type-helpers'
@ -41,6 +42,7 @@ import { FormProMaxItemOptions } from '@/types/components/form//index.ts'
import { FormExpose } from 'ant-design-vue/es/form/Form' import { FormExpose } from 'ant-design-vue/es/form/Form'
import { serviceProjectSaveOrUpdateParams_ } from '@/types/views/serviceManagement' import { serviceProjectSaveOrUpdateParams_ } from '@/types/views/serviceManagement'
import { showEnterprisesUnit } from './index.tsx' import { showEnterprisesUnit } from './index.tsx'
var modal: any
type _FormType = EnterprisesUnitSaveOrUpdateParams & { type _FormType = EnterprisesUnitSaveOrUpdateParams & {
contactPersonInfoName?: string contactPersonInfoName?: string
contactPersonInfoTelephone?: string contactPersonInfoTelephone?: string
@ -238,6 +240,7 @@ const saveOrUpdateEnterprisesUnit = (params: _FormType, callback: Function) => {
type: 'select', type: 'select',
label: '单位类型', label: '单位类型',
required: true, required: true,
placeholder: '请选择单位类型',
// @ts-ignore // @ts-ignore
options: dictSelectNodes('EnterprisesUnitType'), options: dictSelectNodes('EnterprisesUnitType'),
}, },
@ -352,7 +355,7 @@ const netType = computed(() => {
const formParams = ref<{ const formParams = ref<{
snowFlakeId?: string snowFlakeId?: string
enterprisesUnitId: string enterprisesUnitId: string
securityUnitId: string securityUnitId: string | null
administrativeDivisionCodes?: null administrativeDivisionCodes?: null
projectManagerMiniProgramUserId?: string projectManagerMiniProgramUserId?: string
projectManagerMiniProgramUserName?: string projectManagerMiniProgramUserName?: string
@ -372,7 +375,7 @@ const formParams = ref<{
name: '', name: '',
enterprisesUnitId: '', enterprisesUnitId: '',
type: 'security', type: 'security',
securityUnitId: '', securityUnitId: null, // null placeholder
}) })
const securityUnitIdList = ref<any>([]) const securityUnitIdList = ref<any>([])
const formItemOptions = ref<FormProMaxItemOptions<serviceProjectSaveOrUpdateParams_>>({ const formItemOptions = ref<FormProMaxItemOptions<serviceProjectSaveOrUpdateParams_>>({
@ -387,6 +390,15 @@ const formItemOptions = ref<FormProMaxItemOptions<serviceProjectSaveOrUpdatePara
label: '保安单位', label: '保安单位',
required: true, required: true,
options: securityUnitIdList, options: securityUnitIdList,
placeholder: '请选择或搜索保安单位',
componentsProps: {
// placeholder: '',
showSearch: true,
// inputValue option option true false
filterOption: (input: string, option: any) => {
return option.label.toLowerCase().includes(input?.toLowerCase())
},
},
}, },
type: { type: {
type: 'radioGroup', type: 'radioGroup',
@ -616,7 +628,7 @@ const expandedRowRender: TableProMaxProps['expandedRowRender'] = ({ record }) =>
<a-button <a-button
class='btn-warn' class='btn-warn'
onClick={async () => { onClick={async () => {
visible.value = true // visible.value = true
serviceTitle.value = '编辑服务项目' serviceTitle.value = '编辑服务项目'
idNumberDisabled.value = record.twoType.value !== 'outsource' idNumberDisabled.value = record.twoType.value !== 'outsource'
formParams.value.securityUnitId = record.securityUnitId //id formParams.value.securityUnitId = record.securityUnitId //id
@ -635,6 +647,20 @@ const expandedRowRender: TableProMaxProps['expandedRowRender'] = ({ record }) =>
formParams.value.houseTotal = record.houseTotal // formParams.value.houseTotal = record.houseTotal //
formParams.value.staffTotal = record.staffTotal // formParams.value.staffTotal = record.staffTotal //
formParams.value.securityUserTotal = record.securityUserTotal // formParams.value.securityUserTotal = record.securityUserTotal //
modal = Modal.confirm({
title: serviceTitle.value,
icon: createVNode('div'),
width: 600,
centered: true,
content: () => <FormProMax ref={formRef} v-model:value={formParams.value} formItemOptions={formItemOptions.value} />,
onOk: async () => {
await submit()
},
onCancel: async () => {
await closeModal()
},
})
}} }}
> >
编辑 编辑
@ -676,9 +702,10 @@ const expandedRowRender: TableProMaxProps['expandedRowRender'] = ({ record }) =>
} }
const closeModal = async () => { const closeModal = async () => {
console.log(modal)
visible.value = false visible.value = false
formParams.value = { formParams.value = {
securityUnitId: '', securityUnitId: null,
enterprisesUnitId: '', enterprisesUnitId: '',
administrativeDivisionCodes: '', administrativeDivisionCodes: '',
name: '', name: '',
@ -695,6 +722,9 @@ const closeModal = async () => {
enterprisesUnitId.value = '' enterprisesUnitId.value = ''
serviceTitle.value = '新增服务项目' serviceTitle.value = '新增服务项目'
idNumberDisabled.value = false idNumberDisabled.value = false
modal.destroy()
// console.log(modal)
Modal.destroyAll()
} }
const submit = async () => { const submit = async () => {
@ -704,6 +734,7 @@ const submit = async () => {
message.success(resp.message) message.success(resp.message)
await _tableRef.value.requestGetTableData() await _tableRef.value.requestGetTableData()
await closeModal() await closeModal()
// modal.destroy()
} }
onMounted(async () => { onMounted(async () => {
@ -711,7 +742,21 @@ onMounted(async () => {
securityUnitIdList.value = res.data securityUnitIdList.value = res.data
}) })
const addService = function (record) { const addService = function (record) {
// modal.destroy()
formParams.value.enterprisesUnitId = record.snowFlakeId //Id formParams.value.enterprisesUnitId = record.snowFlakeId //Id
visible.value = true // visible.value = true
modal = Modal.confirm({
title: serviceTitle.value,
icon: createVNode('div'),
width: 600,
centered: true,
content: () => <FormProMax ref={formRef} v-model:value={formParams.value} formItemOptions={formItemOptions.value} />,
onOk: async () => {
await submit()
},
onCancel: async () => {
await closeModal()
},
})
} }
</script> </script>

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,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,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,10 @@ 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);
} else {
jsonWriter.writeString("");
}
} }
} }

View File

@ -43,42 +43,43 @@
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,
'businessLicense',su1.business_license, 'businessLicense', su1.business_license,
'legalPersonInfo',su1.legal_person_info, 'legalPersonInfo', su1.legal_person_info,
'address',su1.address, 'address', su1.address,
'nature',su1.nature 'nature', su1.nature
) 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,
'name',su.name, 'photo', su.photo,
'telephone',su.telephone, 'name', su.name,
'workPost',su.work_post, 'telephone', su.telephone,
'sex',su.sex, 'workPost', su.work_post,
'nativePlace',su.native_place, 'sex', su.sex,
'idCard',su.id_card, 'nativePlace', su.native_place,
'dateOfBirth',su.date_of_birth, 'idCard', su.id_card,
'securityNumber',su.security_number, 'dateOfBirth', su.date_of_birth,
'homeAddress',su.home_address, 'securityNumber', su.security_number,
'remark',su.remark, 'homeAddress', su.home_address,
'createTime',su.create_time 'remark', su.remark,
)),JSON_ARRAY()) as 'securityUserList' 'educationLevel', su.education_level,
FROM 'createTime', su.create_time
service_project sp )), JSON_ARRAY()) as 'securityUserList'
FROM 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(
@ -170,6 +172,7 @@
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
@ -199,10 +202,12 @@
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
from enterprises_unit eu 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 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 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 LEFT JOIN security_unit suu ON su.security_unit_id = suu.snow_flake_id AND suu.delete_flag = 0