diff --git a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/controller/app/AppOutdoorFairController.java b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/controller/app/AppOutdoorFairController.java index 7a5a9f6..e3ce47c 100644 --- a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/controller/app/AppOutdoorFairController.java +++ b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/controller/app/AppOutdoorFairController.java @@ -6,10 +6,12 @@ import com.ruoyi.cms.domain.FairCompany; import com.ruoyi.cms.domain.Job; import com.ruoyi.cms.domain.OutdoorFair; import com.ruoyi.cms.domain.OutdoorFairAttendee; +import com.ruoyi.cms.domain.OutdoorFairBooth; import com.ruoyi.cms.domain.OutdoorFairBoothBooking; import com.ruoyi.cms.domain.OutdoorFairDevice; import com.ruoyi.cms.mapper.CompanyMapper; import com.ruoyi.cms.mapper.FairCompanyMapper; +import com.ruoyi.cms.mapper.OutdoorFairBoothMapper; import com.ruoyi.cms.mapper.OutdoorFairBoothBookingMapper; import com.ruoyi.cms.mapper.OutdoorFairDeviceMapper; import com.ruoyi.cms.mapper.OutdoorFairJobMapper; @@ -72,6 +74,9 @@ public class AppOutdoorFairController extends BaseController @Autowired private OutdoorFairBoothBookingMapper outdoorFairBoothBookingMapper; + @Autowired + private OutdoorFairBoothMapper outdoorFairBoothMapper; + @Autowired private OutdoorFairJobMapper outdoorFairJobMapper; @@ -188,7 +193,7 @@ public class AppOutdoorFairController extends BaseController return AjaxResult.error("招聘会不存在"); } Map data = new HashMap<>(); - data.put("fair", fair); + data.put("fair", buildPublicFairDetail(fair)); data.put("fairH5Url", buildFairH5Url(request, fairId)); return success(data); } @@ -361,6 +366,36 @@ public class AppOutdoorFairController extends BaseController return jobFair; } + /** + * 公共(求职者)详情只保留公开招聘会资料。 + * 企业需携带资料与到场须知不能随实体直接序列化到公共接口。 + */ + private OutdoorFair buildPublicFairDetail(OutdoorFair fair) + { + OutdoorFair publicFair = new OutdoorFair(); + publicFair.setId(fair.getId()); + publicFair.setTitle(fair.getTitle()); + publicFair.setHostUnit(fair.getHostUnit()); + publicFair.setFairType(fair.getFairType()); + publicFair.setRegion(fair.getRegion()); + publicFair.setVenueId(fair.getVenueId()); + publicFair.setVenueName(fair.getVenueName()); + publicFair.setAddress(fair.getAddress()); + publicFair.setBoothCount(fair.getBoothCount()); + publicFair.setHoldTime(fair.getHoldTime()); + publicFair.setEndTime(fair.getEndTime()); + publicFair.setApplyStartTime(fair.getApplyStartTime()); + publicFair.setApplyEndTime(fair.getApplyEndTime()); + publicFair.setOnlineApply(fair.getOnlineApply()); + publicFair.setPhotoUrl(fair.getPhotoUrl()); + publicFair.setFairIntroduction(fair.getFairIntroduction()); + publicFair.setFairProcess(fair.getFairProcess()); + Long boothMapCount = outdoorFairBoothMapper.selectCount(new LambdaQueryWrapper() + .eq(OutdoorFairBooth::getFairId, fair.getId())); + publicFair.setBoothMapCount(boothMapCount == null ? 0 : boothMapCount.intValue()); + return publicFair; + } + private Date[] parseDayRange(String day) { try { diff --git a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/controller/cms/OutdoorFairController.java b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/controller/cms/OutdoorFairController.java index e678011..08d966c 100644 --- a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/controller/cms/OutdoorFairController.java +++ b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/controller/cms/OutdoorFairController.java @@ -144,6 +144,56 @@ public class OutdoorFairController extends BaseController return success(outdoorFairService.getById(id)); } + /** + * 企业只读查看当前招聘会的展位图。 + * 仅当前企业已报名且审核通过时返回数据;企业端没有任何展位图写入入口。 + */ + @ApiOperation("企业查看已审核通过户外招聘会的展位图") + @PreAuthorize("@ss.hasPermi('cms:outdoorFair:companyBoothMap')") + @GetMapping("/{fairId}/company/booth-map") + public AjaxResult getCurrentCompanyBoothMap(@PathVariable Long fairId) + { + if (!RoleUtils.isCompanyAdmin()) { + return AjaxResult.error("仅企业用户可查看企业展位图"); + } + Company company = getCurrentCompanyOrThrow(); + ensureFairCompanyApprovedIfCompany(fairId, company.getCompanyId()); + + List booths = outdoorFairBoothMapper.selectList( + new LambdaQueryWrapper() + .eq(OutdoorFairBooth::getFairId, fairId) + .orderByAsc(OutdoorFairBooth::getPositionY) + .orderByAsc(OutdoorFairBooth::getPositionX) + .orderByAsc(OutdoorFairBooth::getBoothNumber)); + Map bookingMap = outdoorFairBoothBookingMapper.selectList( + new LambdaQueryWrapper() + .eq(OutdoorFairBoothBooking::getFairId, fairId) + .eq(OutdoorFairBoothBooking::getStatus, "reserved")) + .stream() + .filter(item -> item.getBoothId() != null) + .collect(Collectors.toMap(OutdoorFairBoothBooking::getBoothId, item -> item, (a, b) -> a)); + + List> rows = new ArrayList<>(); + for (OutdoorFairBooth booth : booths) { + OutdoorFairBoothBooking booking = bookingMap.get(booth.getId()); + Map row = new HashMap<>(); + row.put("id", booth.getId()); + row.put("boothId", booth.getId()); + row.put("boothNumber", booth.getBoothNumber()); + row.put("positionX", booth.getPositionX()); + row.put("positionY", booth.getPositionY()); + row.put("bookingId", booking == null ? null : booking.getId()); + row.put("companyId", booking == null ? null : booking.getCompanyId()); + row.put("companyName", booking == null ? null : booking.getCompanyName()); + row.put("status", booking == null ? "available" : "reserved"); + rows.add(row); + } + Map data = new HashMap<>(); + data.put("currentCompanyId", company.getCompanyId()); + data.put("booths", rows); + return success(data); + } + /** * 招聘会数据统计(dashboard) * 按年/周/月/日维度,统计举办时间落在区间内的招聘会: diff --git a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/domain/OutdoorFair.java b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/domain/OutdoorFair.java index 2466431..807210f 100644 --- a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/domain/OutdoorFair.java +++ b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/domain/OutdoorFair.java @@ -109,6 +109,18 @@ public class OutdoorFair extends BaseEntity @ApiModelProperty("招聘会整体流程") private String fairProcess; + @Excel(name = "需携带资料") + @ApiModelProperty("企业参加招聘会需携带的资料") + private String requiredMaterials; + + @Excel(name = "到场须知") + @ApiModelProperty("企业到场须知") + private String attendanceNotes; + + @TableField(exist = false) + @ApiModelProperty("招聘会展位图实际摊位数量") + private Integer boothMapCount; + @TableField(exist = false) @ApiModelProperty("当前企业ID") private Long companyId; diff --git a/sql/cms_outdoor_fair.sql b/sql/cms_outdoor_fair.sql index 56a7a1a..f126513 100644 --- a/sql/cms_outdoor_fair.sql +++ b/sql/cms_outdoor_fair.sql @@ -26,6 +26,8 @@ CREATE TABLE IF NOT EXISTS "cms_outdoor_fair" ( "photo_url" VARCHAR(500), "fair_introduction" TEXT, "fair_process" TEXT, + "required_materials" TEXT, + "attendance_notes" TEXT, "create_by" VARCHAR(64) DEFAULT '', "create_time" TIMESTAMP(0), "update_by" VARCHAR(64) DEFAULT '', @@ -52,6 +54,8 @@ COMMENT ON COLUMN "cms_outdoor_fair"."online_apply" IS '是否开启线上申请 COMMENT ON COLUMN "cms_outdoor_fair"."photo_url" IS '招聘会照片'; COMMENT ON COLUMN "cms_outdoor_fair"."fair_introduction" IS '招聘会简介'; COMMENT ON COLUMN "cms_outdoor_fair"."fair_process" IS '招聘会整体流程'; +COMMENT ON COLUMN "cms_outdoor_fair"."required_materials" IS '企业需携带资料'; +COMMENT ON COLUMN "cms_outdoor_fair"."attendance_notes" IS '企业到场须知'; COMMENT ON COLUMN "cms_outdoor_fair"."del_flag" IS '删除标志(0代表存在 2代表删除)'; CREATE INDEX IF NOT EXISTS "idx_cms_outdoor_fair_title" ON "cms_outdoor_fair" ("title"); diff --git a/sql/migration_outdoor_fair_company_info_and_permissions.sql b/sql/migration_outdoor_fair_company_info_and_permissions.sql new file mode 100644 index 0000000..932aeb4 --- /dev/null +++ b/sql/migration_outdoor_fair_company_info_and_permissions.sql @@ -0,0 +1,49 @@ +-- 户外招聘会企业参会资料与企业只读展位图权限 +-- 瀚高数据库 / PostgreSQL 兼容;可重复执行 + +ALTER TABLE "cms_outdoor_fair" + ADD COLUMN IF NOT EXISTS "required_materials" TEXT; + +ALTER TABLE "cms_outdoor_fair" + ADD COLUMN IF NOT EXISTS "attendance_notes" TEXT; + +COMMENT ON COLUMN "cms_outdoor_fair"."required_materials" IS '企业需携带资料'; +COMMENT ON COLUMN "cms_outdoor_fair"."attendance_notes" IS '企业到场须知'; + +-- 为企业角色增加“只读查看展位图”按钮权限。 +INSERT INTO "sys_menu" ( + "menu_id", "menu_name", "parent_id", "order_num", "path", "component", "query", "route_name", + "is_frame", "is_cache", "menu_type", "visible", "status", "perms", "icon", + "create_by", "create_time", "update_by", "update_time", "remark" +) +SELECT + (SELECT COALESCE(MAX("menu_id"), 0) + 1 FROM "sys_menu"), + '企业展位图查看', + parent."menu_id", + 2, + '', '', '', '', + 1, 0, 'F', '0', '0', 'cms:outdoorFair:companyBoothMap', '#', + 'system', CURRENT_TIMESTAMP, '', NULL, '户外招聘会-企业审核通过后只读查看展位图权限' +FROM "sys_menu" parent +WHERE parent."menu_id" = ( + SELECT "parent_id" + FROM "sys_menu" + WHERE "perms" = 'cms:outdoorFair:list' + LIMIT 1 + ) + AND NOT EXISTS ( + SELECT 1 FROM "sys_menu" WHERE "perms" = 'cms:outdoorFair:companyBoothMap' + ); + +INSERT INTO "sys_role_menu" ("role_id", "menu_id") +SELECT role."role_id", menu."menu_id" +FROM "sys_role" role +CROSS JOIN "sys_menu" menu +WHERE role."role_key" = 'view' + AND menu."perms" = 'cms:outdoorFair:companyBoothMap' + AND NOT EXISTS ( + SELECT 1 + FROM "sys_role_menu" role_menu + WHERE role_menu."role_id" = role."role_id" + AND role_menu."menu_id" = menu."menu_id" + );