吉安感知网项目-后端
linwei
2026-01-17 4c140a47f9a798832b71a8913a84e8045211b3f7
工单新增
7 files modified
1 files added
255 ■■■■ changed files
drone-common/src/main/java/org/sxkj/common/launch/LauncherServiceImpl.java 3 ●●●●● patch | view | raw | blame | history
drone-common/src/main/java/org/sxkj/common/utils/GeomUtils.java 40 ●●●●● patch | view | raw | blame | history
drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/controller/GdWorkOrderController.java 38 ●●●● patch | view | raw | blame | history
drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/entity/GdWorkOrderEntity.java 4 ●●●● patch | view | raw | blame | history
drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/mapper/GdWorkOrderMapper.xml 41 ●●●●● patch | view | raw | blame | history
drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/param/WorkOrderParam.java 71 ●●●●● patch | view | raw | blame | history
drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/service/IGdWorkOrderService.java 9 ●●●●● patch | view | raw | blame | history
drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/service/impl/GdWorkOrderServiceImpl.java 49 ●●●● patch | view | raw | blame | history
drone-common/src/main/java/org/sxkj/common/launch/LauncherServiceImpl.java
@@ -40,6 +40,9 @@
        PropsUtil.setProperty(props, "spring.cloud.nacos.password", LauncherConstant.NACOS_PASSWORD);
        PropsUtil.setProperty(props, "spring.cloud.nacos.discovery.server-addr", LauncherConstant.nacosAddr(profile));
        PropsUtil.setProperty(props, "spring.cloud.nacos.config.server-addr", LauncherConstant.nacosAddr(profile));
        // 指定命名空间
        PropsUtil.setProperty(props, "spring.cloud.nacos.discovery.namespace", "ja-dev");
        PropsUtil.setProperty(props, "spring.cloud.nacos.config.namespace", "ja-dev");
        PropsUtil.setProperty(props, "spring.cloud.sentinel.transport.dashboard", LauncherConstant.sentinelAddr(profile));
        PropsUtil.setProperty(props, "spring.zipkin.base-url", LauncherConstant.zipkinAddr(profile));
        PropsUtil.setProperty(props, "spring.datasource.dynamic.enabled", "false");
drone-common/src/main/java/org/sxkj/common/utils/GeomUtils.java
@@ -1,9 +1,16 @@
package org.sxkj.common.utils;
import org.apache.commons.lang3.StringUtils;
import org.geotools.geometry.jts.JTSFactoryFinder;
import org.locationtech.jts.geom.Geometry;
import org.locationtech.jts.geom.GeometryFactory;
import org.locationtech.jts.io.ParseException;
import org.locationtech.jts.io.WKTReader;
public class GeomUtils {
    private static final GeometryFactory geometryFactory = JTSFactoryFinder.getGeometryFactory();
    private static final WKTReader wktReader = new WKTReader(geometryFactory);
    public static boolean isGeomInvalid(String geom) {
        if (StringUtils.isBlank(geom)) {
@@ -12,4 +19,35 @@
        String upper = geom.trim().toUpperCase();
        return !upper.contains("POLYGON");
    }
    /**
     * 验证并转换几何数据,确保其有效
     * @param geom WKT格式的几何数据
     * @return 有效的几何数据,或null如果转换失败
     */
    public static String validateAndFormatGeom(String geom) {
        if (StringUtils.isBlank(geom)) {
            return null;
        }
        try {
            // 解析WKT字符串
            Geometry geometry = wktReader.read(geom);
            // 如果几何数据无效,尝试修复
            if (!geometry.isValid()) {
                geometry = geometry.buffer(0);
            }
            // 确保几何数据有效
            if (geometry.isValid()) {
                return geometry.toText();
            } else {
                return null;
            }
        } catch (ParseException e) {
            // 解析失败
            return null;
        }
    }
}
drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/controller/GdWorkOrderController.java
@@ -32,6 +32,7 @@
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.sxkj.gd.workorder.entity.GdWorkOrderEntity;
import org.sxkj.gd.workorder.param.WorkOrderParam;
import org.sxkj.gd.workorder.vo.GdWorkOrderVO;
import org.sxkj.gd.workorder.excel.GdWorkOrderExcel;
import org.sxkj.gd.workorder.wrapper.GdWorkOrderWrapper;
@@ -69,16 +70,7 @@
        GdWorkOrderEntity detail = gdWorkOrderService.getOne(Condition.getQueryWrapper(gdWorkOrder));
        return R.data(GdWorkOrderWrapper.build().entityVO(detail));
    }
    /**
     * 工单任务表 分页
     */
    @GetMapping("/list")
    @ApiOperationSupport(order = 2)
    @ApiOperation(value = "分页", notes = "传入gdWorkOrder")
    public R<IPage<GdWorkOrderVO>> list(@ApiIgnore @RequestParam Map<String, Object> gdWorkOrder, Query query) {
        IPage<GdWorkOrderEntity> pages = gdWorkOrderService.page(Condition.getPage(query), Condition.getQueryWrapper(gdWorkOrder, GdWorkOrderEntity.class));
        return R.data(GdWorkOrderWrapper.build().pageVO(pages));
    }
    /**
     * 工单任务表 自定义分页
@@ -94,31 +86,11 @@
    /**
     * 工单任务表 新增
     */
    @PostMapping("/save")
    @PostMapping("/submit")
    @ApiOperationSupport(order = 4)
    @ApiOperation(value = "新增", notes = "传入gdWorkOrder")
    public R save(@Valid @RequestBody GdWorkOrderEntity gdWorkOrder) {
        return R.status(gdWorkOrderService.save(gdWorkOrder));
    }
    /**
     * 工单任务表 修改
     */
    @PostMapping("/update")
    @ApiOperationSupport(order = 5)
    @ApiOperation(value = "修改", notes = "传入gdWorkOrder")
    public R update(@Valid @RequestBody GdWorkOrderEntity gdWorkOrder) {
        return R.status(gdWorkOrderService.updateById(gdWorkOrder));
    }
    /**
     * 工单任务表 新增或修改
     */
    @PostMapping("/submit")
    @ApiOperationSupport(order = 6)
    @ApiOperation(value = "新增或修改", notes = "传入gdWorkOrder")
    public R submit(@Valid @RequestBody GdWorkOrderEntity gdWorkOrder) {
        return R.status(gdWorkOrderService.saveOrUpdate(gdWorkOrder));
    public R save(@Valid @RequestBody WorkOrderParam workOrderParam) {
        return R.status(gdWorkOrderService.saveOrUpdateWorkOrder(workOrderParam));
    }
    /**
drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/entity/GdWorkOrderEntity.java
@@ -66,7 +66,7 @@
     * 工单状态:0草稿、10发布中_接单中、11发布中_拒绝接单、20响应中_待拆分、21响应中_申请取消、22响应中_申请修改、23响应中_已取消、30执行中_待全部完成、31执行中_协商修改、40完成待验_待全部验收、50验收通过_待结算、60结算完成_已结算
     */
    @ApiModelProperty(value = "工单状态:0草稿、10发布中_接单中、11发布中_拒绝接单、20响应中_待拆分、21响应中_申请取消、22响应中_申请修改、23响应中_已取消、30执行中_待全部完成、31执行中_协商修改、40完成待验_待全部验收、50验收通过_待结算、60结算完成_已结算")
    private Byte workOrderStatus;
    private Byte workOrderStatus = 0;
    /**
     * 执行时间范围-开始
     */
@@ -86,7 +86,7 @@
     * 经纬度面(存储地理面数据)
     */
    @ApiModelProperty(value = "经纬度面(存储地理面数据)")
    private byte[] geom;
    private String geom;
    /**
     * 备注
     */
drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/mapper/GdWorkOrderMapper.xml
@@ -36,4 +36,45 @@
        SELECT * FROM ja_gd_work_order ${ew.customSqlSegment}
    </select>
    <!-- 自定义插入语句,使用ST_GeomFromText处理几何数据 -->
    <insert id="insert" parameterType="org.sxkj.gd.workorder.entity.GdWorkOrderEntity">
        INSERT INTO ja_gd_work_order (
            id, work_order_name, work_order_code, work_order_type,
            device_load_demand, recommend_device_ids, work_order_status,
            execute_start_time, execute_end_time, service_party,
            geom, remark, area_code,
            create_user, create_dept, create_time,
            update_user, update_time, status, is_deleted
        ) VALUES (
            #{id}, #{workOrderName}, #{workOrderCode}, #{workOrderType},
            #{deviceLoadDemand}, #{recommendDeviceIds}, #{workOrderStatus},
            #{executeStartTime}, #{executeEndTime}, #{serviceParty},
            ST_GeomFromText(#{geom}), #{remark}, #{areaCode},
            #{createUser}, #{createDept}, #{createTime},
            #{updateUser}, #{updateTime}, #{status}, #{isDeleted}
        )
    </insert>
    <!-- 自定义更新语句,使用ST_GeomFromText处理几何数据 -->
    <update id="updateById" parameterType="org.sxkj.gd.workorder.entity.GdWorkOrderEntity">
        UPDATE ja_gd_work_order SET
            work_order_name = #{workOrderName},
            work_order_code = #{workOrderCode},
            work_order_type = #{workOrderType},
            device_load_demand = #{deviceLoadDemand},
            recommend_device_ids = #{recommendDeviceIds},
            work_order_status = #{workOrderStatus},
            execute_start_time = #{executeStartTime},
            execute_end_time = #{executeEndTime},
            service_party = #{serviceParty},
            geom = ST_GeomFromText(#{geom}),
            remark = #{remark},
            area_code = #{areaCode},
            update_user = #{updateUser},
            update_time = #{updateTime},
            status = #{status},
            is_deleted = #{isDeleted}
        WHERE id = #{id}
    </update>
</mapper>
drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/param/WorkOrderParam.java
New file
@@ -0,0 +1,71 @@
package org.sxkj.gd.workorder.param;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotNull;
import java.util.Date;
@Data
public class WorkOrderParam {
    @ApiModelProperty(value = "id")
    private Long id;
    /**
     * 工单名称
     */
    @ApiModelProperty(value = "工单名称")
    @NotNull
    private String workOrderName;
    /**
     * 工单类型(巡查类/安检类等)
     */
    @ApiModelProperty(value = "工单类型(1.巡查类/2.安检类等)")
    @NotNull
    private String workOrderType;
    /**
     * 设备负载需求(红外、喊话器、探照灯)
     */
    @ApiModelProperty(value = "设备负载需求(1.红外、2.喊话器、3.探照灯)")
    @NotNull
    private String deviceLoadDemand;
    @ApiModelProperty(value = "工单状态:0草稿、10发布中_接单中、11发布中_拒绝接单、20响应中_待拆分、21响应中_申请取消、22响应中_申请修改、23响应中_已取消、30执行中_待全部完成、31执行中_协商修改、40完成待验_待全部验收、50验收通过_待结算、60结算完成_已结算")
    @NotNull
    private String workOrderStatus;
    /**
     * 推荐设备ID(逗号分隔)
     */
    @ApiModelProperty(value = "推荐设备ID(逗号分隔)")
    private String recommendDeviceIds;
    /**
     * 执行时间范围-开始
     */
    @ApiModelProperty(value = "执行时间范围-开始")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    @NotNull
    private Date executeStartTime;
    /**
     * 执行时间范围-结束
     */
    @ApiModelProperty(value = "执行时间范围-结束")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    @NotNull
    private Date executeEndTime;
    /**
     * 经纬度面(存储地理面数据)
     */
    @ApiModelProperty(value = "经纬度面(存储地理面数据)")
    @NotNull
    private String geom;
    /**
     * 备注
     */
    @ApiModelProperty(value = "备注")
    private String remark;
}
drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/service/IGdWorkOrderService.java
@@ -18,10 +18,13 @@
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import org.sxkj.gd.workorder.entity.GdWorkOrderEntity;
import org.sxkj.gd.workorder.param.WorkOrderParam;
import org.sxkj.gd.workorder.vo.GdWorkOrderVO;
import org.sxkj.gd.workorder.excel.GdWorkOrderExcel;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.springblade.core.mp.base.BaseService;
import javax.validation.Valid;
import java.util.List;
/**
@@ -49,4 +52,10 @@
     */
    List<GdWorkOrderExcel> exportGdWorkOrder(Wrapper<GdWorkOrderEntity> queryWrapper);
    /**
     * 保存或更新工单任务表
     * @param workOrderParam
     * @return
     */
    boolean saveOrUpdateWorkOrder(@Valid WorkOrderParam workOrderParam);
}
drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/service/impl/GdWorkOrderServiceImpl.java
@@ -16,16 +16,24 @@
 */
package org.sxkj.gd.workorder.service.impl;
import org.sxkj.gd.workorder.entity.GdWorkOrderEntity;
import org.sxkj.gd.workorder.vo.GdWorkOrderVO;
import org.sxkj.gd.workorder.excel.GdWorkOrderExcel;
import org.sxkj.gd.workorder.mapper.GdWorkOrderMapper;
import org.sxkj.gd.workorder.service.IGdWorkOrderService;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.apache.commons.lang3.StringUtils;
import org.springblade.core.mp.base.BaseServiceImpl;
import org.springblade.core.secure.utils.AuthUtil;
import org.springblade.core.tool.utils.BeanUtil;
import org.springframework.stereotype.Service;
import org.sxkj.common.utils.GeomUtils;
import org.sxkj.common.utils.OrderNumUtils;
import org.sxkj.gd.workorder.entity.GdWorkOrderEntity;
import org.sxkj.gd.workorder.excel.GdWorkOrderExcel;
import org.sxkj.gd.workorder.mapper.GdWorkOrderMapper;
import org.sxkj.gd.workorder.param.WorkOrderParam;
import org.sxkj.gd.workorder.service.IGdWorkOrderService;
import org.sxkj.gd.workorder.vo.GdWorkOrderVO;
import java.util.List;
import java.util.Objects;
/**
 * 工单任务表 服务实现类
@@ -51,4 +59,33 @@
        return gdWorkOrderList;
    }
    /**
     * 保存或更新工单任务表
     * @param workOrderParam
     * @return
     */
    @Override
    public boolean saveOrUpdateWorkOrder(WorkOrderParam workOrderParam) {
        GdWorkOrderEntity entity = Objects.requireNonNull(BeanUtil.copy(workOrderParam, GdWorkOrderEntity.class));
        // 验证并格式化几何数据
        String geom = entity.getGeom();
        String validatedGeom = GeomUtils.validateAndFormatGeom(geom);
        if (validatedGeom == null) {
            return false;
        }
        // 设置验证后的几何数据
        entity.setGeom(validatedGeom);
        // 生成工单编号
        if (StringUtils.isBlank(entity.getWorkOrderCode())) {
            // 使用时间戳生成唯一工单编号
            String timestamp = OrderNumUtils.initOrderNum("gdTicketInfo");
            entity.setWorkOrderCode("GD" + timestamp);
        }
        entity.setCreateUser(AuthUtil.getUserId());
        entity.setCreateDept(Long.valueOf(AuthUtil.getDeptId()));
        return saveOrUpdate(entity);
    }
}