From 926e065fb0b4424d0d51023c234a92433bac61c8 Mon Sep 17 00:00:00 2001 From: Pu Zhibing <393733352@qq.com> Date: 星期五, 01 八月 2025 11:53:45 +0800 Subject: [PATCH] Merge branch 'master' of http://120.76.84.145:10101/gitblit/r/java/QianYunTong --- UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/UserInfoController.java | 1 DriverQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TDriverPromotionActivity.java | 1 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/server/IOrderPrivateCarService.java | 4 UserQYTTravel/guns-admin/pom.xml | 21 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/vo/TripSheetVo.java | 33 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/service/IOrderTaxiService.java | 12 ManagementQYTTravel/guns-admin/src/main/webapp/static/modular/system/tPromotionOrderCar/tPromotionOrder.js | 219 ++ UserQYTTravel/guns-admin/src/main/resources/static/fonts/AlibabaPuHuiTi-3-105-Heavy.ttf | 0 ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITOrderPrivateCarService.java | 5 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/dao/mapping/OrderPrivateCarMapper.xml | 48 ManagementQYTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/tDriverPromotionActivity/tDriverPromotionActivity_add.html | 236 ++ ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TOrderCrossCity.java | 20 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/vo/TripOrderVo.java | 155 + ManagementQYTTravel/guns-admin/src/main/webapp/static/modular/system/tDriverPromotionActivity/tDriverPromotionActivity2.js | 191 ++ UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/service/impl/OrderTaxiServiceImpl.java | 28 UserQYTTravel/guns-admin/src/main/resources/application.yml | 50 ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TOrderPrivateCar.java | 22 ManagementQYTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/tDriverPromotionActivity/tDriverPromotionActivity_edit.html | 268 +++ UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/dao/OrderTaxiMapper.java | 12 ManagementQYTTravel/guns-admin/src/main/webapp/static/modular/system/tPromotionOrderCar/tAbnormalOrderCar_info.js | 312 +++ UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/server/IOrderCrossCityService.java | 3 ManagementQYTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/tDriverPromotionActivity/tDriverPromotionActivityUser.html | 40 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/pdf/TripSheetGenerator.java | 337 ++++ ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TDriverPromotionActivityServiceImpl.java | 117 + ManagementQYTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/tSysReformist/tSysReformist.html | 2 ManagementQYTTravel/guns-admin/src/main/webapp/static/modular/system/tDriverPromotionActivity/tDriverPromotionActivity1.js | 196 ++ UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/dao/mapping/OrderTaxiMapper.xml | 46 ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/specialTrain/TPromotionOrderCarController.java | 209 ++ ManagementQYTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/tPromotionOrderCar/tPromotionOrder.html | 121 + UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/server/impl/OrderPrivateCarServiceImpl.java | 29 ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TDriverPromotionActivity.java | 109 + ManagementQYTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/tDriverPromotionActivity/tDriverPromotionActivity_detail.html | 384 ++++ UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/model/OrderCrossCity.java | 10 ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITDriverPromotionActivityService.java | 28 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/dao/mapping/OrderCrossCityMapper.xml | 59 ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TOrderPrivateCarMapper.xml | 167 ++ UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/EmailUtil.java | 52 ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/specialTrain/TDriverPromotionActivityController.java | 364 ++++ ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TOrderPrivateCarMapper.java | 4 ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TUser.java | 33 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/UserInfo.java | 11 DriverQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/server/impl/OrderPrivateCarServiceImpl.java | 2 ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/DriverRankVo.java | 16 ManagementQYTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/tDriverPromotionActivity/tDriverPromotionActivity.html | 53 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/dao/OrderPrivateCarMapper.java | 5 ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TOrderPrivateCarServiceImpl.java | 10 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/dao/OrderCrossCityMapper.java | 5 ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TOrderTaxi.java | 20 ManagementQYTTravel/guns-admin/src/main/webapp/static/modular/system/tDriverPromotionActivity/tDriverPromotionActivity_info.js | 110 + UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TDriverPromotionActivity.java | 2 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/model/OrderPrivateCar.java | 80 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/model/OrderTaxi.java | 11 ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TDriverPromotionActivityMapper.xml | 60 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/server/impl/OrderCrossCityServiceImpl.java | 27 DriverQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/service/impl/OrderTaxiServiceImpl.java | 2 ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TDriverPromotionActivityMapper.java | 22 ManagementQYTTravel/guns-admin/src/main/webapp/static/modular/system/tDriverPromotionActivity/tDriverPromotionActivity.js | 209 ++ UserQYTTravel/guns-admin/src/main/resources/static/img/logo.png | 0 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/OrderController.java | 307 +++ 59 files changed, 4,790 insertions(+), 110 deletions(-) diff --git a/DriverQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/server/impl/OrderPrivateCarServiceImpl.java b/DriverQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/server/impl/OrderPrivateCarServiceImpl.java index 13f8988..90700fe 100644 --- a/DriverQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/server/impl/OrderPrivateCarServiceImpl.java +++ b/DriverQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/server/impl/OrderPrivateCarServiceImpl.java @@ -371,7 +371,7 @@ UserInfo userInfo = userInfoMapper.selectById(userId); if(userInfo.getBindDriverId()!=null && userInfo.getBindExpireDate().getTime()<=System.currentTimeMillis()){ String registAreaCode = userInfo.getRegistAreaCode(); - TDriverPromotionActivity tDriverPromotionActivity = driverPromotionActivityService.selectOne(new EntityWrapper<TDriverPromotionActivity>().eq("districtCode", registAreaCode).ge("startTime", new Date()).lt("endTime", new Date()).last("AND FIND_IN_SET(" + 1 + ", bizType) limit 1")); + TDriverPromotionActivity tDriverPromotionActivity = driverPromotionActivityService.selectOne(new EntityWrapper<TDriverPromotionActivity>().eq("state",1).eq("districtCode", registAreaCode).ge("startTime", new Date()).lt("endTime", new Date()).last("AND FIND_IN_SET(" + 1 + ", bizType) limit 1")); if(tDriverPromotionActivity!=null){ return 2; } diff --git a/DriverQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TDriverPromotionActivity.java b/DriverQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TDriverPromotionActivity.java index c67d940..cc0556f 100644 --- a/DriverQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TDriverPromotionActivity.java +++ b/DriverQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TDriverPromotionActivity.java @@ -100,6 +100,7 @@ private Date createTime; private Date updateTime; + private Integer state; @Override protected Serializable pkVal() { diff --git a/DriverQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/service/impl/OrderTaxiServiceImpl.java b/DriverQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/service/impl/OrderTaxiServiceImpl.java index 6f71f7e..7bcf42c 100644 --- a/DriverQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/service/impl/OrderTaxiServiceImpl.java +++ b/DriverQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/service/impl/OrderTaxiServiceImpl.java @@ -331,7 +331,7 @@ UserInfo userInfo = userInfoMapper.selectById(userId); if(userInfo.getBindDriverId()!=null && userInfo.getBindExpireDate().getTime()<=System.currentTimeMillis()){ String registAreaCode = userInfo.getRegistAreaCode(); - TDriverPromotionActivity tDriverPromotionActivity = driverPromotionActivityService.selectOne(new EntityWrapper<TDriverPromotionActivity>().eq("districtCode", registAreaCode).ge("startTime", new Date()).lt("endTime", new Date()).last("AND FIND_IN_SET(" + 1 + ", bizType) limit 1")); + TDriverPromotionActivity tDriverPromotionActivity = driverPromotionActivityService.selectOne(new EntityWrapper<TDriverPromotionActivity>().eq("state",1).eq("districtCode", registAreaCode).ge("startTime", new Date()).lt("endTime", new Date()).last("AND FIND_IN_SET(" + 1 + ", bizType) limit 1")); if(tDriverPromotionActivity!=null){ return userInfo.getBindDriverId(); } diff --git a/ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/specialTrain/TDriverPromotionActivityController.java b/ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/specialTrain/TDriverPromotionActivityController.java new file mode 100644 index 0000000..cc921d3 --- /dev/null +++ b/ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/specialTrain/TDriverPromotionActivityController.java @@ -0,0 +1,364 @@ +package com.stylefeng.guns.modular.system.controller.specialTrain; + +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.rabbitmq.client.LongString; +import com.stylefeng.guns.core.base.controller.BaseController; +import com.stylefeng.guns.core.beetl.ShiroExtUtil; +import com.stylefeng.guns.core.util.DateUtil; +import com.stylefeng.guns.core.util.SinataUtil; +import com.stylefeng.guns.core.util.ToolUtil; +import com.stylefeng.guns.modular.system.model.DriverRankVo; +import com.stylefeng.guns.modular.system.model.TRegion; +import com.stylefeng.guns.modular.system.service.ITRegionService; +import com.stylefeng.guns.modular.system.util.ExcelExportUtil; +import lombok.SneakyThrows; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.ui.Model; +import org.springframework.beans.factory.annotation.Autowired; +import com.stylefeng.guns.core.log.LogObjectHolder; +import com.stylefeng.guns.modular.system.model.TDriverPromotionActivity; +import com.stylefeng.guns.modular.system.service.ITDriverPromotionActivityService; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.math.BigDecimal; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.*; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2025-07-31 11:20:54 + */ +@Controller +@RequestMapping("/tDriverPromotionActivity") +public class TDriverPromotionActivityController extends BaseController { + + private String PREFIX = "/system/tDriverPromotionActivity/"; + + @Autowired + private ITDriverPromotionActivityService tDriverPromotionActivityService; + + @Autowired + private ITRegionService tRegionService; + + + @Autowired + private ShiroExtUtil shiroExtUtil; + + /** + * 跳转到首页 + */ + @RequestMapping("") + public String index() { + return PREFIX + "tDriverPromotionActivity.html"; + } + + /** + * 跳转到添加 + */ + @RequestMapping("/tDriverPromotionActivity_add") + public String tDriverPromotionActivityAdd(Model model) { + List<TRegion> provinceList = tRegionService.selectList(new EntityWrapper<TRegion>().eq("parent_id", 0)); + model.addAttribute("provinceList",provinceList); + return PREFIX + "tDriverPromotionActivity_add.html"; + } + + /** + * 跳转到修改 + */ + @RequestMapping("/tDriverPromotionActivity_update/{tDriverPromotionActivityId}") + public String tDriverPromotionActivityUpdate(@PathVariable Integer tDriverPromotionActivityId, Model model) { + TDriverPromotionActivity tDriverPromotionActivity = tDriverPromotionActivityService.selectById(tDriverPromotionActivityId); + model.addAttribute("item",tDriverPromotionActivity); + + SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd"); + model.addAttribute("time",simpleDateFormat.format(tDriverPromotionActivity.getStartTime())+" - "+simpleDateFormat.format(tDriverPromotionActivity.getEndTime())); + + + LogObjectHolder.me().set(tDriverPromotionActivity); + List<TRegion> provinceList = tRegionService.selectList(new EntityWrapper<TRegion>().eq("parent_id", 0)); + model.addAttribute("provinceList",provinceList); + + TRegion province = tRegionService.selectOne(new EntityWrapper<TRegion>().eq("code", tDriverPromotionActivity.getProvinceCode())); + //市 + List<TRegion> cityList = tRegionService.selectList(new EntityWrapper<TRegion>().eq("parent_id", province.getId())); + model.addAttribute("cityList",cityList); + + //区 + TRegion city = tRegionService.selectOne(new EntityWrapper<TRegion>().eq("code", tDriverPromotionActivity.getCityCode())); + List<TRegion> areaList = tRegionService.selectList(new EntityWrapper<TRegion>().eq("parent_id", city.getId())); + model.addAttribute("areaList",areaList); + + + + + + + + + return PREFIX + "tDriverPromotionActivity_edit.html"; + } + @RequestMapping("/tDriverPromotionActivity_viewUser/{id}") + public String tDriverPromotionActivityViewUser(@PathVariable Integer id, Model model) { + + model.addAttribute("driverId",id); + return PREFIX + "tDriverPromotionActivityUser.html"; + } + /** + * 跳转到修改 + */ + @RequestMapping("/tDriverPromotionActivity_info/{tDriverPromotionActivityId}") + public String tDriverPromotionActivityInfo(@PathVariable Integer tDriverPromotionActivityId, Model model) { + TDriverPromotionActivity tDriverPromotionActivity = tDriverPromotionActivityService.selectById(tDriverPromotionActivityId); + model.addAttribute("item",tDriverPromotionActivity); + + SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd"); + model.addAttribute("time",simpleDateFormat.format(tDriverPromotionActivity.getStartTime())+" - "+simpleDateFormat.format(tDriverPromotionActivity.getEndTime())); + + + LogObjectHolder.me().set(tDriverPromotionActivity); + List<TRegion> provinceList = tRegionService.selectList(new EntityWrapper<TRegion>().eq("parent_id", 0)); + model.addAttribute("provinceList",provinceList); + + TRegion province = tRegionService.selectOne(new EntityWrapper<TRegion>().eq("code", tDriverPromotionActivity.getProvinceCode())); + //市 + List<TRegion> cityList = tRegionService.selectList(new EntityWrapper<TRegion>().eq("parent_id", province.getId())); + model.addAttribute("cityList",cityList); + + //区 + TRegion city = tRegionService.selectOne(new EntityWrapper<TRegion>().eq("code", tDriverPromotionActivity.getCityCode())); + List<TRegion> areaList = tRegionService.selectList(new EntityWrapper<TRegion>().eq("parent_id", city.getId())); + model.addAttribute("areaList",areaList); + + return PREFIX + "tDriverPromotionActivity_detail.html"; + } + + /** + * 获取列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String insertTime,String name,Integer status) { + + String beginTime = null; + String endTime = null; + if (SinataUtil.isNotEmpty(insertTime)) { + String[] timeArray = insertTime.split(" - "); + beginTime = timeArray[0]; + endTime = timeArray[1]; + } + return tDriverPromotionActivityService.list(beginTime,endTime,name,status); + } + + + + + /** + * 获取列表 + */ + @RequestMapping(value = "/list1") + @ResponseBody + public Object list1(Long id,String driverName) { + + return tDriverPromotionActivityService.list1(id,driverName); + } + @RequestMapping(value = "/list2") + @ResponseBody + public Object list2(Long driverId,String name) { + + return tDriverPromotionActivityService.list2(driverId,name); + } + @GetMapping("/export1") + @ResponseBody + public void export1(Long driverId,String name, HttpServletRequest request, HttpServletResponse response) { + try { + ArrayList<HashMap<String, Object>> list = tDriverPromotionActivityService.list2(driverId, name); + + + // 表格数据【封装】 + List<List<String>> dataList = new ArrayList<>(); + + //第一行显示【封装】 + List<String> twoList = new ArrayList<String>(); + twoList.add("总计:"); + twoList.add(String.valueOf(list.size())+"条"); + dataList.add(twoList); + // 列【封装】 + List<String> shellList = new ArrayList<String>(); + shellList.add("序号"); + shellList.add("用户昵称"); + shellList.add("用户手机号"); + shellList.add("绑定时间"); + shellList.add("有效期至"); + shellList.add("产生收益合计"); + dataList.add(shellList); + Integer index = 0; + for (HashMap<String, Object> object : list){ + index++; + // 详细数据列【封装】 + shellList = new ArrayList<String>(); + shellList.add(index.toString()); + shellList.add(object.get("userName").toString()); + shellList.add(object.get("userPhone").toString()); + shellList.add(object.get("bindDate").toString()); + shellList.add(object.get("bindExpireDate").toString()); + shellList.add(object.get("money").toString()); + + dataList.add(shellList); + } + try { + // 调用工具类进行导出 + ExcelExportUtil.easySheet("司机推广下级用户导出记录"+DateUtil.formatDate(new Date(), "YYYYMMddHHmmss"), "司机推广下级用户导出记录", dataList,request, response); + } catch (Exception e) { + e.printStackTrace(); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + + + @GetMapping("/export") + @ResponseBody + public void export(Long id,String driverName, HttpServletRequest request, HttpServletResponse response) { + try { + List<DriverRankVo> list = tDriverPromotionActivityService.list1(id, driverName); + + + // 表格数据【封装】 + List<List<String>> dataList = new ArrayList<>(); + + //第一行显示【封装】 + List<String> twoList = new ArrayList<String>(); + twoList.add("总计:"); + twoList.add(String.valueOf(list.size())+"条"); + dataList.add(twoList); + // 列【封装】 + List<String> shellList = new ArrayList<String>(); + shellList.add("推广排名"); + shellList.add("司机姓名"); + shellList.add("推广用户数量"); + shellList.add("推广收益合计"); + dataList.add(shellList); + Integer index = 0; + for (DriverRankVo object : list){ + index++; + // 详细数据列【封装】 + shellList = new ArrayList<String>(); + shellList.add(index.toString()); + shellList.add(object.getDriverName()); + shellList.add(object.getUserNum().toString()); + shellList.add(object.getMoney().toString()); + + + dataList.add(shellList); + } + try { + // 调用工具类进行导出 + ExcelExportUtil.easySheet("推广情况导出记录"+DateUtil.formatDate(new Date(), "YYYYMMddHHmmss"), "推广情况导出记录", dataList,request, response); + } catch (Exception e) { + e.printStackTrace(); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + + + /** + * 新增 + */ + @RequestMapping(value = "/add") + @ResponseBody + public Object add(String activityTitle,String bizTypeValue,String province,String city,String area,String time,Integer commissionRatio,Integer bindingDays,String content) throws ParseException { + SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + TDriverPromotionActivity tDriverPromotionActivity = new TDriverPromotionActivity(); + tDriverPromotionActivity.setActivityTitle(activityTitle); + tDriverPromotionActivity.setBizType(bizTypeValue); + tDriverPromotionActivity.setProvinceCode(province); + tDriverPromotionActivity.setCityCode(city); + tDriverPromotionActivity.setDistrictCode(area); + String s = time.split(" - ")[0] + " 00:00:00"; + String s1 = time.split(" - ")[1] + " 23:59:59"; + tDriverPromotionActivity.setStartTime(simpleDateFormat.parse(s)); + tDriverPromotionActivity.setEndTime(simpleDateFormat.parse(s1)); + tDriverPromotionActivity.setCommissionRatio(BigDecimal.valueOf(commissionRatio)); + tDriverPromotionActivity.setBindingDays(bindingDays); + tDriverPromotionActivity.setActivityDesc(ToolUtil.cleanXSS(content)); + tDriverPromotionActivity.setStatus(1); + tDriverPromotionActivity.setCreator(shiroExtUtil.getUser().getName()); + tDriverPromotionActivity.setCreateTime(new Date()); + tDriverPromotionActivityService.insert(tDriverPromotionActivity); + return SUCCESS_TIP; + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(@RequestParam Integer tDriverPromotionActivityId) { + TDriverPromotionActivity tDriverPromotionActivity = tDriverPromotionActivityService.selectById(tDriverPromotionActivityId); + tDriverPromotionActivity.setRemove(1); + tDriverPromotionActivityService.updateById(tDriverPromotionActivity); + return SUCCESS_TIP; + } + @RequestMapping(value = "/stop") + @ResponseBody + public Object stop(@RequestParam Integer id) { + TDriverPromotionActivity tDriverPromotionActivity = tDriverPromotionActivityService.selectById(id); + tDriverPromotionActivity.setState(2); + tDriverPromotionActivityService.updateById(tDriverPromotionActivity); + return SUCCESS_TIP; + } + @RequestMapping(value = "/start") + @ResponseBody + public Object start(@RequestParam Integer id) { + TDriverPromotionActivity tDriverPromotionActivity = tDriverPromotionActivityService.selectById(id); + tDriverPromotionActivity.setState(1); + tDriverPromotionActivityService.updateById(tDriverPromotionActivity); + return SUCCESS_TIP; + } + + /** + * 修改 + */ + @SneakyThrows + @RequestMapping(value = "/update") + @ResponseBody + public Object update(Long id,String activityTitle, String bizTypeValue, String province, String city, String area, String time, Integer commissionRatio, Integer bindingDays, String content) { + TDriverPromotionActivity tDriverPromotionActivity = tDriverPromotionActivityService.selectById(id); + SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + tDriverPromotionActivity.setActivityTitle(activityTitle); + tDriverPromotionActivity.setBizType(bizTypeValue); + tDriverPromotionActivity.setProvinceCode(province); + tDriverPromotionActivity.setCityCode(city); + tDriverPromotionActivity.setDistrictCode(area); + String s = time.split(" - ")[0] + " 00:00:00"; + String s1 = time.split(" - ")[1] + " 23:59:59"; + tDriverPromotionActivity.setStartTime(simpleDateFormat.parse(s)); + tDriverPromotionActivity.setEndTime(simpleDateFormat.parse(s1)); + tDriverPromotionActivity.setCommissionRatio(BigDecimal.valueOf(commissionRatio)); + tDriverPromotionActivity.setBindingDays(bindingDays); + tDriverPromotionActivity.setActivityDesc(ToolUtil.cleanXSS(content)); + tDriverPromotionActivity.setStatus(1); + tDriverPromotionActivity.setCreator(shiroExtUtil.getUser().getName()); + tDriverPromotionActivity.setCreateTime(new Date()); + tDriverPromotionActivity.setUpdateTime(new Date()); + tDriverPromotionActivityService.updateById(tDriverPromotionActivity); + return SUCCESS_TIP; + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{tDriverPromotionActivityId}") + @ResponseBody + public Object detail(@PathVariable("tDriverPromotionActivityId") Integer tDriverPromotionActivityId) { + return tDriverPromotionActivityService.selectById(tDriverPromotionActivityId); + } +} diff --git a/ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/specialTrain/TPromotionOrderCarController.java b/ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/specialTrain/TPromotionOrderCarController.java new file mode 100644 index 0000000..67e223b --- /dev/null +++ b/ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/specialTrain/TPromotionOrderCarController.java @@ -0,0 +1,209 @@ +package com.stylefeng.guns.modular.system.controller.specialTrain; + +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.mapper.Wrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.stylefeng.guns.core.base.controller.BaseController; +import com.stylefeng.guns.core.beetl.ShiroExtUtil; +import com.stylefeng.guns.core.common.constant.factory.PageFactory; +import com.stylefeng.guns.core.util.DateUtil; +import com.stylefeng.guns.core.util.SinataUtil; +import com.stylefeng.guns.core.util.ToolUtil; +import com.stylefeng.guns.modular.system.dao.OrderCancelMapper; +import com.stylefeng.guns.modular.system.model.*; +import com.stylefeng.guns.modular.system.service.*; +import com.stylefeng.guns.modular.system.util.*; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.data.domain.Sort; +import org.springframework.data.mongodb.core.MongoTemplate; +import org.springframework.data.mongodb.core.query.Criteria; +import org.springframework.data.mongodb.core.query.Query; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.math.BigDecimal; +import java.util.*; + +/** + * 快车订单控制器 + * + * @author fengshuonan + * @Date 2020-09-02 17:28:59 + */ +@Controller +@RequestMapping("/promotionInfo") +public class TPromotionOrderCarController extends BaseController { + + private String PREFIX = "/system/tPromotionOrderCar/"; + + @Autowired + private ITOrderPrivateCarService tOrderPrivateCarService; + + @Autowired + private ShiroExtUtil shiroExtUtil; + + + /** + * 跳转到快车订单首页 + */ + @RequestMapping("") + public String index(Model model) { + List<Map<String, Object>> list=new ArrayList<>(); + list = tOrderPrivateCarService.promotionInfoExport(null, null, null, null, null, null, null, shiroExtUtil.getUser().getRoleType(), shiroExtUtil.getUser().getObjectId()); + BigDecimal reduce = list.stream().map(e -> new BigDecimal(e.get("promotionMoney").toString())).reduce(BigDecimal.ZERO, BigDecimal::add); + model.addAttribute("money",reduce); + model.addAttribute("size",list.size()); + + return PREFIX + "tPromotionOrder.html"; + } + + + /** + * 获取快车订单列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String insertTime, + String orderNum, + String userName, + String name, + String driverName){ + String beginTime = null; + String endTime = null; + if (SinataUtil.isNotEmpty(insertTime)) { + String[] timeArray = insertTime.split(" - "); + beginTime = timeArray[0]; + endTime = timeArray[1]; + } + Page<Map<String, Object>> page = new PageFactory<Map<String, Object>>().defaultPage(); + page.setRecords(tOrderPrivateCarService.promotionInfo(page, beginTime, endTime, orderNum, userName, name, driverName, shiroExtUtil.getUser().getRoleType(), shiroExtUtil.getUser().getObjectId())); + return super.packForBT(page); + } + + + + @GetMapping("/export") + @ResponseBody + public void export(String insertTime, + String orderNum, + String userName, + String name, + String driverName, HttpServletRequest request, HttpServletResponse response) { + try { + String beginTime = null; + String endTime = null; + if (SinataUtil.isNotEmpty(insertTime)) { + String[] timeArray = insertTime.split(" - "); + beginTime = timeArray[0]; + endTime = timeArray[1]; + } + List<Map<String, Object>> list=new ArrayList<>(); + list = tOrderPrivateCarService.promotionInfoExport(null, beginTime, endTime, orderNum, userName, name, driverName, shiroExtUtil.getUser().getRoleType(), shiroExtUtil.getUser().getObjectId()); + + + // 表格数据【封装】 + List<List<String>> dataList = new ArrayList<>(); + + //第一行显示【封装】 + List<String> twoList = new ArrayList<String>(); + twoList.add("总计:"); + twoList.add(String.valueOf(list.size())+"条"); + dataList.add(twoList); + + // 列【封装】 + List<String> shellList = new ArrayList<String>(); + shellList.add("活动名称"); + shellList.add("司机名称"); + shellList.add("下级用户"); + shellList.add("订单编号"); + shellList.add("订单金额"); + shellList.add("司机推广收益"); + shellList.add("收益时间"); + dataList.add(shellList); + + for (Map<String,Object> object : list){ + // 详细数据列【封装】 + shellList = new ArrayList<String>(); + if(SinataUtil.isNotEmpty(object.get("name"))){ + shellList.add(object.get("name").toString()); + }else{ + shellList.add("-"); + } + if(SinataUtil.isNotEmpty(object.get("driverName"))){ + shellList.add(object.get("driverName").toString()); + }else{ + shellList.add("-"); + } + if(SinataUtil.isNotEmpty(object.get("userName"))){ + shellList.add(object.get("userName").toString()); + }else{ + shellList.add("-"); + } + if(SinataUtil.isNotEmpty(object.get("orderNum"))){ + shellList.add(object.get("orderNum").toString()); + }else{ + shellList.add("-"); + } + if(SinataUtil.isNotEmpty(object.get("money"))){ + shellList.add(object.get("money").toString()); + }else{ + shellList.add("-"); + } + if(SinataUtil.isNotEmpty(object.get("promotionMoney"))){ + shellList.add(object.get("promotionMoney").toString()); + }else{ + shellList.add("-"); + } + + if(SinataUtil.isNotEmpty(object.get("successTime"))){ + shellList.add(DateUtil.formatDate(DateUtil.parse(object.get("successTime").toString(),"YYYY-MM-dd HH:mm:ss.S"), "YYYY-MM-dd HH:mm:ss")); + }else{ + shellList.add("-"); + } + + + + dataList.add(shellList); + } + try { + // 调用工具类进行导出 + ExcelExportUtil.easySheet("推广收益明细导出记录"+DateUtil.formatDate(new Date(), "YYYYMMddHHmmss"), "推广收益明细导出记录", dataList,request, response); + } catch (Exception e) { + e.printStackTrace(); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + + @PostMapping("/list1") + @ResponseBody + public Object list1(String insertTime, + String orderNum, + String userName, + String name, + String driverName) { + String beginTime = null; + String endTime = null; + if (SinataUtil.isNotEmpty(insertTime)) { + String[] timeArray = insertTime.split(" - "); + beginTime = timeArray[0]; + endTime = timeArray[1]; + } + List<Map<String, Object>> list=new ArrayList<>(); + list = tOrderPrivateCarService.promotionInfoExport(null, beginTime, endTime, orderNum, userName, name, driverName, shiroExtUtil.getUser().getRoleType(), shiroExtUtil.getUser().getObjectId()); + HashMap<String, Object> map = new HashMap<>(); + BigDecimal reduce = list.stream().map(e -> new BigDecimal(e.get("promotionMoney").toString())).reduce(BigDecimal.ZERO, BigDecimal::add); + map.put("money", reduce); + map.put("size", list.size()); + return map; + } + + + +} diff --git a/ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TDriverPromotionActivityMapper.java b/ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TDriverPromotionActivityMapper.java new file mode 100644 index 0000000..32900b7 --- /dev/null +++ b/ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TDriverPromotionActivityMapper.java @@ -0,0 +1,22 @@ +package com.stylefeng.guns.modular.system.dao; + +import com.stylefeng.guns.modular.system.model.TDriverPromotionActivity; +import com.baomidou.mybatisplus.mapper.BaseMapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + * <p> + * 司机推广活动主表 Mapper 接口 + * </p> + * + * @author stylefeng + * @since 2025-07-31 + */ +public interface TDriverPromotionActivityMapper extends BaseMapper<TDriverPromotionActivity> { + + List<Map<String,Object>> list(@Param("beginTime") String beginTime, @Param("endTime") String endTime, @Param("name") String name, @Param("status") Integer status); + +} diff --git a/ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TOrderPrivateCarMapper.java b/ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TOrderPrivateCarMapper.java index 9d1908d..ef8edfb 100644 --- a/ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TOrderPrivateCarMapper.java +++ b/ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TOrderPrivateCarMapper.java @@ -70,4 +70,8 @@ List<Map<String,Object>> getSurcharge(@Param("id") Object id,@Param("orderType") Integer orderType); + + List<Map<String, Object>> promotionInfo(@Param("page") Page<Map<String, Object>> page, @Param("beginTime") String beginTime, @Param("endTime") String endTime, @Param("orderNum") String orderNum, @Param("userName") String userName, @Param("name") String name, @Param("driverName") String driverName, @Param("roleType") Integer roleType, @Param("objectId") Integer objectId); + + List<Map<String, Object>> promotionInfoExport(@Param("beginTime") String beginTime, @Param("endTime") String endTime, @Param("orderNum") String orderNum, @Param("userName") String userName, @Param("name") String name, @Param("driverName") String driverName, @Param("roleType") Integer roleType, @Param("objectId") Integer objectId); } diff --git a/ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TDriverPromotionActivityMapper.xml b/ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TDriverPromotionActivityMapper.xml new file mode 100644 index 0000000..f31aa95 --- /dev/null +++ b/ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TDriverPromotionActivityMapper.xml @@ -0,0 +1,60 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> +<mapper namespace="com.stylefeng.guns.modular.system.dao.TDriverPromotionActivityMapper"> + + <!-- 通用查询映射结果 --> + <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.TDriverPromotionActivity"> + <id column="id" property="id" /> + <result column="bizType" property="bizType" /> + <result column="activityTitle" property="activityTitle" /> + <result column="province" property="province" /> + <result column="provinceCode" property="provinceCode" /> + <result column="city" property="city" /> + <result column="cityCode" property="cityCode" /> + <result column="district" property="district" /> + <result column="districtCode" property="districtCode" /> + <result column="startTime" property="startTime" /> + <result column="endTime" property="endTime" /> + <result column="commissionRatio" property="commissionRatio" /> + <result column="bindingDays" property="bindingDays" /> + <result column="activityDesc" property="activityDesc" /> + <result column="status" property="status" /> + <result column="creator" property="creator" /> + <result column="createTime" property="createTime" /> + <result column="updateTime" property="updateTime" /> + </resultMap> + + <!-- 通用查询结果列 --> + <sql id="Base_Column_List"> + id, bizType, activityTitle, province, provinceCode, city, cityCode, district, districtCode, startTime, endTime, commissionRatio, bindingDays, activityDesc, creator, createTime, updateTime, + </sql> + + <select id="list" resultType="java.util.Map"> +select * from ( + select <include refid="Base_Column_List"/> + case + when now()>endTime then 4 + when startTime>now() then 3 + when now()>startTime and endTime >now() and state =1 then 1 + when now()>startTime and endTime >now() and state =2 then 2 + else 0 + end as status + from t_driver_promotion_activity + where remove=0 + <if test="beginTime != null and endTime != null"> + and createTime between #{beginTime} and #{endTime} + </if> + + <if test="name != null"> + and activityTitle like concat('%',#{name},'%') + </if> + ) t1 where 1=1 + <if test="status!= null"> + and t1.status =#{status} + </if> + order by t1.createTime desc + + + </select> + +</mapper> diff --git a/ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TOrderPrivateCarMapper.xml b/ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TOrderPrivateCarMapper.xml index f0b5ae9..27d4230 100644 --- a/ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TOrderPrivateCarMapper.xml +++ b/ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TOrderPrivateCarMapper.xml @@ -259,4 +259,171 @@ SELECT IFNULL(amount,0) amount,b.`name` FROM t_order_additional_fee a LEFT JOIN t_additional_fee b ON a.additionalFeeId=b.id WHERE a.orderId=#{id} AND a.orderType=#{orderType} AND a.id>1 AND amount>0 </select> + + + + <select id="promotionInfo" resultType="java.util.Map"> +select * from ( + select t1.orderNum,t1.promotionMoney,t1.successTime,t1.payMoney money,t2.activityTitle name,t3.name driverName,t4.nickName userName + from t_order_private_car t1 + LEFT JOIN t_driver_promotion_activity t2 ON t1.promotionActivityId = t2.id + LEFT JOIN t_driver t3 ON t1.promotionDriverId = t3.id + LEFT JOIN t_user t4 ON t1.userId = t4.id + where t1.promotionActivityId is not null + <if test="orderNum != null and orderNum != ''"> + and t1.orderNum =#{orderNum} + </if> + <if test="beginTime != null and endTime != null"> + and t1.successTime between #{beginTime} and #{endTime} + </if> + <if test="userName != null and userName != ''"> + and t4.nickName like CONCAT('%',#{userName},'%') + </if> + <if test="name != null and name != ''"> + and t2.activityTitle like CONCAT('%',#{name},'%') + </if> + <if test="driverName != null and driverName != ''"> + and t3.name like CONCAT('%',#{driverName},'%') + </if> + <if test="roleType != null and roleType != '' and roleType != 1"> + and t1.companyId = #{objectId} + </if> + + union all + select t1.orderNum,t1.promotionMoney,t1.successTime,t1.payMoney money,t2.activityTitle name,t3.name driverName,t4.nickName userName + from t_order_taxi t1 + LEFT JOIN t_driver_promotion_activity t2 ON t1.promotionActivityId = t2.id + LEFT JOIN t_driver t3 ON t1.promotionDriverId = t3.id + LEFT JOIN t_user t4 ON t1.userId = t4.id + where t1.promotionActivityId is not null + <if test="orderNum != null and orderNum != ''"> + and t1.orderNum =#{orderNum} + </if> + <if test="beginTime != null and endTime != null"> + and t1.successTime between #{beginTime} and #{endTime} + </if> + <if test="userName != null and userName != ''"> + and t4.nickName like CONCAT('%',#{userName},'%') + </if> + <if test="name != null and name != ''"> + and t2.activityTitle like CONCAT('%',#{name},'%') + </if> + <if test="driverName != null and driverName != ''"> + and t3.name like CONCAT('%',#{driverName},'%') + </if> + <if test="roleType != null and roleType != '' and roleType != 1"> + and t1.companyId = #{objectId} + </if> + + union all + + select t1.orderNum,t1.promotionMoney,t1.successTime,t1.payMoney money,t2.activityTitle name,t3.name driverName,t4.nickName userName + from t_order_cross_city t1 + LEFT JOIN t_driver_promotion_activity t2 ON t1.promotionActivityId = t2.id + LEFT JOIN t_driver t3 ON t1.promotionDriverId = t3.id + LEFT JOIN t_user t4 ON t1.userId = t4.id + where t1.promotionActivityId is not null + <if test="orderNum != null and orderNum != ''"> + and t1.orderNum =#{orderNum} + </if> + <if test="beginTime != null and endTime != null"> + and t1.successTime between #{beginTime} and #{endTime} + </if> + <if test="userName != null and userName != ''"> + and t4.nickName like CONCAT('%',#{userName},'%') + </if> + <if test="name != null and name != ''"> + and t2.activityTitle like CONCAT('%',#{name},'%') + </if> + <if test="driverName != null and driverName != ''"> + and t3.name like CONCAT('%',#{driverName},'%') + </if> + <if test="roleType != null and roleType != '' and roleType != 1"> + and t1.companyId = #{objectId} + </if> + ) as t5 order by t5.successTime desc + + </select> + <select id="promotionInfoExport" resultType="java.util.Map"> + select * from ( + select t1.orderNum,t1.promotionMoney,t1.successTime,t1.payMoney money,t2.activityTitle name,t3.name driverName,t4.nickName userName + from t_order_private_car t1 + LEFT JOIN t_driver_promotion_activity t2 ON t1.promotionActivityId = t2.id + LEFT JOIN t_driver t3 ON t1.promotionDriverId = t3.id + LEFT JOIN t_user t4 ON t1.userId = t4.id + where t1.promotionActivityId is not null + <if test="orderNum != null and orderNum != ''"> + and t1.orderNum =#{orderNum} + </if> + <if test="beginTime != null and endTime != null"> + and t1.successTime between #{beginTime} and #{endTime} + </if> + <if test="userName != null and userName != ''"> + and t4.nickName like CONCAT('%',#{userName},'%') + </if> + <if test="name != null and name != ''"> + and t2.activityTitle like CONCAT('%',#{name},'%') + </if> + <if test="driverName != null and driverName != ''"> + and t3.name like CONCAT('%',#{driverName},'%') + </if> + <if test="roleType != null and roleType != '' and roleType != 1"> + and t1.companyId = #{objectId} + </if> + + union all + select t1.orderNum,t1.promotionMoney,t1.successTime,t1.payMoney money,t2.activityTitle name,t3.name driverName,t4.nickName userName + from t_order_taxi t1 + LEFT JOIN t_driver_promotion_activity t2 ON t1.promotionActivityId = t2.id + LEFT JOIN t_driver t3 ON t1.promotionDriverId = t3.id + LEFT JOIN t_user t4 ON t1.userId = t4.id + where t1.promotionActivityId is not null + <if test="orderNum != null and orderNum != ''"> + and t1.orderNum =#{orderNum} + </if> + <if test="beginTime != null and endTime != null"> + and t1.successTime between #{beginTime} and #{endTime} + </if> + <if test="userName != null and userName != ''"> + and t4.nickName like CONCAT('%',#{userName},'%') + </if> + <if test="name != null and name != ''"> + and t2.activityTitle like CONCAT('%',#{name},'%') + </if> + <if test="driverName != null and driverName != ''"> + and t3.name like CONCAT('%',#{driverName},'%') + </if> + <if test="roleType != null and roleType != '' and roleType != 1"> + and t1.companyId = #{objectId} + </if> + + union all + + select t1.orderNum,t1.promotionMoney,t1.successTime,t1.payMoney money,t2.activityTitle name,t3.name driverName,t4.nickName userName + from t_order_cross_city t1 + LEFT JOIN t_driver_promotion_activity t2 ON t1.promotionActivityId = t2.id + LEFT JOIN t_driver t3 ON t1.promotionDriverId = t3.id + LEFT JOIN t_user t4 ON t1.userId = t4.id + where t1.promotionActivityId is not null + <if test="orderNum != null and orderNum != ''"> + and t1.orderNum =#{orderNum} + </if> + <if test="beginTime != null and endTime != null"> + and t1.successTime between #{beginTime} and #{endTime} + </if> + <if test="userName != null and userName != ''"> + and t4.nickName like CONCAT('%',#{userName},'%') + </if> + <if test="name != null and name != ''"> + and t2.activityTitle like CONCAT('%',#{name},'%') + </if> + <if test="driverName != null and driverName != ''"> + and t3.name like CONCAT('%',#{driverName},'%') + </if> + <if test="roleType != null and roleType != '' and roleType != 1"> + and t1.companyId = #{objectId} + </if> + ) as t5 order by t5.successTime desc + </select> + </mapper> diff --git a/ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/DriverRankVo.java b/ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/DriverRankVo.java new file mode 100644 index 0000000..845273f --- /dev/null +++ b/ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/DriverRankVo.java @@ -0,0 +1,16 @@ +package com.stylefeng.guns.modular.system.model; + +import lombok.Data; + +import java.math.BigDecimal; + +@Data +public class DriverRankVo { + private Integer driverId; + + private String driverName; + + private Integer userNum; + + private BigDecimal money; +} diff --git a/ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TDriverPromotionActivity.java b/ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TDriverPromotionActivity.java new file mode 100644 index 0000000..b6366bb --- /dev/null +++ b/ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TDriverPromotionActivity.java @@ -0,0 +1,109 @@ +package com.stylefeng.guns.modular.system.model; + +import com.baomidou.mybatisplus.enums.IdType; +import java.math.BigDecimal; +import java.util.Date; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableName; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; + +import java.io.Serializable; + +/** + * <p> + * 司机推广活动主表 + * </p> + * + * @author stylefeng + * @since 2025-07-31 + */ +@TableName("t_driver_promotion_activity") +@Data +public class TDriverPromotionActivity extends Model<TDriverPromotionActivity>{ + + private static final long serialVersionUID = 1L; + + /** + * 推广活动ID + */ + @TableId(value = "id", type = IdType.AUTO) + private Long id; + /** + * 关联业务:1-专车/2-出租车/3-城际/4-顺风车/5-代驾 + */ + private String bizType; + /** + * 推广活动标题 + */ + private String activityTitle; + /** + * 活动区域-省 + */ + private String province; + /** + * 省code + */ + private String provinceCode; + /** + * 活动区域-市 + */ + private String city; + /** + * 市code + */ + private String cityCode; + /** + * 活动区域-区/县 + */ + private String district; + /** + * 区code + */ + private String districtCode; + /** + * 活动开始时间 + */ + private Date startTime; + /** + * 活动结束时间 + */ + private Date endTime; + /** + * 抽佣比例(如 10.00 代表 10%) + */ + @JsonFormat(shape = JsonFormat.Shape.STRING) + private BigDecimal commissionRatio; + /** + * 司机乘客绑定有效期(天) + */ + private Integer bindingDays; + /** + * 推广活动说明 + */ + private String activityDesc; + /** + * 状态:1-未开始 2-进行中 3-已结束 + */ + private Integer status; + /** + * 创建人 + */ + private String creator; + private Date createTime; + private Date updateTime; + + private Integer state; + /** + * + * 删除标识:0-正常 1-删除 + */ + private Integer remove; + @Override + protected Serializable pkVal() { + return this.id; + } + + +} diff --git a/ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TOrderCrossCity.java b/ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TOrderCrossCity.java index f4e1444..903157b 100644 --- a/ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TOrderCrossCity.java +++ b/ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TOrderCrossCity.java @@ -307,6 +307,26 @@ private String abnormalRemark; + private Integer promotionDriverId; + + private BigDecimal promotionMoney; + + public BigDecimal getPromotionMoney() { + return promotionMoney; + } + + public void setPromotionMoney(BigDecimal promotionMoney) { + this.promotionMoney = promotionMoney; + } + + public Integer getPromotionDriverId() { + return promotionDriverId; + } + + public void setPromotionDriverId(Integer promotionDriverId) { + this.promotionDriverId = promotionDriverId; + } + public Integer getAbnormalStatus() { return abnormalStatus; } diff --git a/ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TOrderPrivateCar.java b/ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TOrderPrivateCar.java index 018d71a..150e4a7 100644 --- a/ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TOrderPrivateCar.java +++ b/ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TOrderPrivateCar.java @@ -344,6 +344,28 @@ private String abnormalRemark; + + private Integer promotionDriverId; + + + private BigDecimal promotionMoney; + + public BigDecimal getPromotionMoney() { + return promotionMoney; + } + + public void setPromotionMoney(BigDecimal promotionMoney) { + this.promotionMoney = promotionMoney; + } + + public Integer getPromotionDriverId() { + return promotionDriverId; + } + + public void setPromotionDriverId(Integer promotionDriverId) { + this.promotionDriverId = promotionDriverId; + } + public Integer getAbnormalStatus() { return abnormalStatus; } diff --git a/ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TOrderTaxi.java b/ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TOrderTaxi.java index d9648b9..9e240dc 100644 --- a/ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TOrderTaxi.java +++ b/ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TOrderTaxi.java @@ -310,6 +310,26 @@ private BigDecimal responsibilityMoney; + private Integer promotionDriverId; + + private BigDecimal promotionMoney; + + public BigDecimal getPromotionMoney() { + return promotionMoney; + } + + public void setPromotionMoney(BigDecimal promotionMoney) { + this.promotionMoney = promotionMoney; + } + + public Integer getPromotionDriverId() { + return promotionDriverId; + } + + public void setPromotionDriverId(Integer promotionDriverId) { + this.promotionDriverId = promotionDriverId; + } + public Integer getAbnormalStatus() { return abnormalStatus; } diff --git a/ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TUser.java b/ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TUser.java index 50711b0..acc7e52 100644 --- a/ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TUser.java +++ b/ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TUser.java @@ -139,8 +139,37 @@ * 实名认证照片 */ private String certificationImg; - - + + private Integer bindDriverId; + + private Date bindDate; + + private Date bindExpireDate; + + public Date getBindDate() { + return bindDate; + } + + public void setBindDate(Date bindDate) { + this.bindDate = bindDate; + } + + public Date getBindExpireDate() { + return bindExpireDate; + } + + public void setBindExpireDate(Date bindExpireDate) { + this.bindExpireDate = bindExpireDate; + } + + public Integer getBindDriverId() { + return bindDriverId; + } + + public void setBindDriverId(Integer bindDriverId) { + this.bindDriverId = bindDriverId; + } + public Integer getId() { return id; } diff --git a/ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITDriverPromotionActivityService.java b/ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITDriverPromotionActivityService.java new file mode 100644 index 0000000..721acbb --- /dev/null +++ b/ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITDriverPromotionActivityService.java @@ -0,0 +1,28 @@ +package com.stylefeng.guns.modular.system.service; + +import com.stylefeng.guns.modular.system.model.DriverRankVo; +import com.stylefeng.guns.modular.system.model.TDriverPromotionActivity; +import com.baomidou.mybatisplus.service.IService; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +/** + * <p> + * 司机推广活动主表 服务类 + * </p> + * + * @author stylefeng + * @since 2025-07-31 + */ +public interface ITDriverPromotionActivityService extends IService<TDriverPromotionActivity> { + + Object list(String beginTime, String endTime, String name, Integer status); + + List<DriverRankVo> list1(Long id, String driverName); + + + ArrayList<HashMap<String, Object>> list2(Long driverId, String name); + +} diff --git a/ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITOrderPrivateCarService.java b/ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITOrderPrivateCarService.java index 19f3cc3..7b1da0c 100644 --- a/ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITOrderPrivateCarService.java +++ b/ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITOrderPrivateCarService.java @@ -70,4 +70,9 @@ List<Map<String,Object>> getSurcharge(Object id,Integer orderType); + + List<Map<String, Object>> promotionInfo(Page<Map<String, Object>> page, String beginTime, String endTime, String orderNum, String userName, String name, String driverName, Integer roleType, Integer objectId); + + + List<Map<String, Object>> promotionInfoExport(Object o, String beginTime, String endTime, String orderNum, String userName, String name, String driverName, Integer roleType, Integer objectId); } diff --git a/ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TDriverPromotionActivityServiceImpl.java b/ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TDriverPromotionActivityServiceImpl.java new file mode 100644 index 0000000..c581749 --- /dev/null +++ b/ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TDriverPromotionActivityServiceImpl.java @@ -0,0 +1,117 @@ +package com.stylefeng.guns.modular.system.service.impl; + +import cn.hutool.system.UserInfo; +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.mapper.Wrapper; +import com.stylefeng.guns.modular.system.model.*; +import com.stylefeng.guns.modular.system.dao.TDriverPromotionActivityMapper; +import com.stylefeng.guns.modular.system.service.*; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.math.BigDecimal; +import java.text.SimpleDateFormat; +import java.util.*; +import java.util.stream.Collectors; + +/** + * <p> + * 司机推广活动主表 服务实现类 + * </p> + * + * @author stylefeng + * @since 2025-07-31 + */ +@Service +public class TDriverPromotionActivityServiceImpl extends ServiceImpl<TDriverPromotionActivityMapper, TDriverPromotionActivity> implements ITDriverPromotionActivityService { + + @Autowired + private ITDriverService driverService; + @Autowired + private ITUserService userService; + @Autowired + private ITOrderPrivateCarService orderPrivateCarService; + @Autowired + private ITOrderTaxiService orderTaxiService; + @Autowired + private ITOrderCrossCityService orderCrossCityService; + + @Override + public Object list(String beginTime, String endTime, String name, Integer status) { + return this.baseMapper.list(beginTime, endTime, name, status); + } + + @Override + public List<DriverRankVo> list1(Long id, String driverName) { + List<DriverRankVo> hashMaps = new ArrayList<>(); + + // 获取所有的司机 + Wrapper<TDriver> flag = new EntityWrapper<TDriver>().ne("flag", 3); + if (driverName != null && !"".equals(driverName)) { + flag.like("name", driverName); + } + + List<TDriver> tDrivers = driverService.selectList(flag); + + // 获取绑定的司机的用户 + List<TUser> tUsers = userService.selectList(new EntityWrapper<TUser>().isNotNull("bindDriverId").gt("bindExpireDate", new Date())); + + // 获取所有获得司机收益的订单 + List<TOrderPrivateCar> tOrderPrivateCars = orderPrivateCarService.selectList(new EntityWrapper<TOrderPrivateCar>().eq("promotionActivityId",id).isNotNull("promotionDriverId").isNotNull("successTime")); + List<TOrderTaxi> tOrderTaxis = orderTaxiService.selectList(new EntityWrapper<TOrderTaxi>().eq("promotionActivityId",id).isNotNull("promotionDriverId").isNotNull("successTime")); + List<TOrderCrossCity> tOrderCrossCities = orderCrossCityService.selectList(new EntityWrapper<TOrderCrossCity>().eq("promotionActivityId",id).isNotNull("promotionDriverId").isNotNull("successTime")); + + + for (TDriver tDriver : tDrivers) { + DriverRankVo driverRankVo = new DriverRankVo(); + driverRankVo.setDriverId(tDriver.getId()); + driverRankVo.setDriverName(tDriver.getName()); + long count = tUsers.stream().filter(e -> tDriver.getId().equals(e.getBindDriverId())).count(); + driverRankVo.setUserNum((int) count); + + BigDecimal reduce = tOrderPrivateCars.stream().filter(e -> tDriver.getId().equals(e.getPromotionDriverId())).map(TOrderPrivateCar::getPromotionMoney).reduce(BigDecimal.ZERO, BigDecimal::add); + BigDecimal reduce1 = tOrderTaxis.stream().filter(e -> tDriver.getId().equals(e.getPromotionDriverId())).map(TOrderTaxi::getPromotionMoney).reduce(BigDecimal.ZERO, BigDecimal::add); + BigDecimal reduce2 = tOrderCrossCities.stream().filter(e -> tDriver.getId().equals(e.getPromotionDriverId())).map(TOrderCrossCity::getPromotionMoney).reduce(BigDecimal.ZERO, BigDecimal::add); + driverRankVo.setMoney(reduce.add(reduce1).add(reduce2)); + hashMaps.add(driverRankVo); + } +// hashMaps.stream().sorted(Comparator.comparing(e -> Integer.valueOf(e.get("userNum").toString())).reversed()).collect(Collectors.toList()) + // hashMaps 通过userNUm 倒叙 + List<DriverRankVo> collect = hashMaps.stream().sorted(Comparator.comparing(DriverRankVo::getUserNum).reversed()).collect(Collectors.toList()); + return collect; + } + + @Override + public ArrayList<HashMap<String, Object>> list2(Long driverId, String name) { + ArrayList<HashMap<String, Object>> hashMaps = new ArrayList<>(); + + Wrapper<TUser> gt = new EntityWrapper<TUser>().eq("bindDriverId", driverId).gt("bindExpireDate", new Date()); + if (name != null && !"".equals(name)) { + gt.like("nickName", name); + } + + // 获取所有获得司机收益的订单 + List<TOrderPrivateCar> tOrderPrivateCars = orderPrivateCarService.selectList(new EntityWrapper<TOrderPrivateCar>().eq("promotionDriverId",driverId).isNotNull("successTime")); + List<TOrderTaxi> tOrderTaxis = orderTaxiService.selectList(new EntityWrapper<TOrderTaxi>().eq("promotionDriverId",driverId).isNotNull("successTime")); + List<TOrderCrossCity> tOrderCrossCities = orderCrossCityService.selectList(new EntityWrapper<TOrderCrossCity>().eq("promotionDriverId",driverId).isNotNull("successTime")); + + // 找出绑定这个司机的用户 + List<TUser> tUsers = userService.selectList(gt); + SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + for (TUser tUser : tUsers) { + HashMap<String, Object> map = new HashMap<>(); + map.put("userId", tUser.getId()); + map.put("userName", tUser.getNickName()); + map.put("userPhone", tUser.getPhone()); + map.put("bindDate",simpleDateFormat.format( tUser.getBindDate())); + map.put("bindExpireDate",simpleDateFormat.format( tUser.getBindExpireDate())); + BigDecimal reduce = tOrderPrivateCars.stream().filter(e -> e.getUserId().equals(tUser.getId())).map(TOrderPrivateCar::getPromotionMoney).reduce(BigDecimal.ZERO, BigDecimal::add); + BigDecimal reduce1 = tOrderTaxis.stream().filter(e -> e.getUserId().equals(tUser.getId())).map(TOrderTaxi::getPromotionMoney).reduce(BigDecimal.ZERO, BigDecimal::add); + BigDecimal reduce2 = tOrderCrossCities.stream().filter(e -> e.getUserId().equals(tUser.getId())).map(TOrderCrossCity::getPromotionMoney).reduce(BigDecimal.ZERO, BigDecimal::add); + map.put("money", reduce.add(reduce1).add(reduce2)); + hashMaps.add( map); + } + return hashMaps; + } +} diff --git a/ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TOrderPrivateCarServiceImpl.java b/ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TOrderPrivateCarServiceImpl.java index 15648ff..6373e9d 100644 --- a/ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TOrderPrivateCarServiceImpl.java +++ b/ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TOrderPrivateCarServiceImpl.java @@ -113,4 +113,14 @@ public List<Map<String, Object>> getSurcharge(Object id, Integer orderType) { return this.baseMapper.getSurcharge(id,orderType); } + + @Override + public List<Map<String, Object>> promotionInfo(Page<Map<String, Object>> page, String beginTime, String endTime, String orderNum, String userName, String name, String driverName, Integer roleType, Integer objectId) { + return this.baseMapper.promotionInfo(page, beginTime, endTime, orderNum, userName, name, driverName, roleType, objectId); + } + + @Override + public List<Map<String, Object>> promotionInfoExport(Object o, String beginTime, String endTime, String orderNum, String userName, String name, String driverName, Integer roleType, Integer objectId) { + return this.baseMapper.promotionInfoExport(beginTime, endTime, orderNum, userName, name, driverName, roleType, objectId); + } } diff --git a/ManagementQYTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/tDriverPromotionActivity/tDriverPromotionActivity.html b/ManagementQYTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/tDriverPromotionActivity/tDriverPromotionActivity.html new file mode 100644 index 0000000..323426c --- /dev/null +++ b/ManagementQYTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/tDriverPromotionActivity/tDriverPromotionActivity.html @@ -0,0 +1,53 @@ +@layout("/common/_container.html"){ +<div class="row"> + <div class="col-sm-12"> + <div class="ibox float-e-margins"> + <div class="ibox-title"> + <h5>管理</h5> + </div> + <div class="ibox-content"> + <div class="row row-lg"> + <div class="col-sm-12"> + <div class="row"> + <div class="col-sm-3"> + <#TimeCon id="insertTime" name="添加时间" isTime="false"/> + </div> + <div class="col-sm-3"> + <#NameCon id="name" name="活动名称" /> + </div> + <div class="col-sm-3"> + <#SelectCon id="status" name="状态" > + <option value="">全部</option> + <!-- <option value="1">APP下单</option>--> + <option value="1">已开启</option> + <option value="2">暂停</option> + <!-- <option value="4">司机下单</option>--> + <option value="3">未开启</option> + <!-- <option value="6">道行龙城下单</option>--> + </#SelectCon> + </div> + <div class="col-sm-3"> + <#button name="重置" icon="" clickFun="TDriverPromotionActivity.research()"/> + <#button name="搜索" icon="" clickFun="TDriverPromotionActivity.search()"/> + </div> + </div> + <div class="hidden-xs" id="TDriverPromotionActivityTableToolbar" role="group"> + <#button name="添加" icon="fa-plus" clickFun="TDriverPromotionActivity.openAddTDriverPromotionActivity()"/> + <#button name="暂停/开启" icon="fa-edit" clickFun="TDriverPromotionActivity.startOrStop()" space="true"/> + </div> + <#table id="TDriverPromotionActivityTable"/> + </div> + </div> + </div> + </div> + </div> +</div> +<script src="${ctxPath}/static/modular/system/tDriverPromotionActivity/tDriverPromotionActivity.js"></script> +<script> + laydate.render({ + elem: '#insertTime' + ,range: true + }); +</script> + +@} diff --git a/ManagementQYTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/tDriverPromotionActivity/tDriverPromotionActivityUser.html b/ManagementQYTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/tDriverPromotionActivity/tDriverPromotionActivityUser.html new file mode 100644 index 0000000..2d589a3 --- /dev/null +++ b/ManagementQYTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/tDriverPromotionActivity/tDriverPromotionActivityUser.html @@ -0,0 +1,40 @@ +@layout("/common/_container.html"){ +<div class="row"> + <div class="col-sm-12"> + <div class="ibox float-e-margins"> + <div class="ibox-title"> + <h5>司机推广下级用户</h5> + </div> + <div class="ibox-content"> + <div class="row row-lg"> + <input type="hidden" id="driverId" value="${driverId}"/> + <div class="col-sm-12"> + <div class="row"> + + <div class="col-sm-3"> + <#NameCon id="name" name="用户姓名" /> + </div> + <div class="col-sm-3"> + <#button name="重置" icon="" clickFun="TDriverPromotionActivity.research()"/> + <#button name="搜索" icon="" clickFun="TDriverPromotionActivity.search()"/> + </div> + </div> + <div class="hidden-xs" id="TDriverPromotionActivityTableToolbar" role="group"> + <#button name="导出Excel" icon="" clickFun="TDriverPromotionActivity.exportExcel()" space="true"/> + </div> + <#table id="TDriverPromotionActivityTable"/> + </div> + </div> + </div> + </div> + </div> +</div> +<script src="${ctxPath}/static/modular/system/tDriverPromotionActivity/tDriverPromotionActivity2.js"></script> +<script> + laydate.render({ + elem: '#insertTime' + ,range: true + }); +</script> + +@} diff --git a/ManagementQYTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/tDriverPromotionActivity/tDriverPromotionActivity_add.html b/ManagementQYTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/tDriverPromotionActivity/tDriverPromotionActivity_add.html new file mode 100644 index 0000000..f4cdd3e --- /dev/null +++ b/ManagementQYTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/tDriverPromotionActivity/tDriverPromotionActivity_add.html @@ -0,0 +1,236 @@ +@layout("/common/_container.html"){ +<div class="ibox float-e-margins"> + <div class="ibox-content"> + <div class="form-horizontal"> + + <div class="row"> + <div class="col-sm-4"> + <#input id="activityTitle" name="推广活动标题"/> + </div> + </div> + + <div class="row" style="margin-left: -24px"> + <label class="col-sm-1 control-label">关联业务:</label> + <div class="col-sm-3"> + <label class="checkbox-inline"> + <input type="checkbox" name="bizType" value="1"> 专车 + </label> + <label class="checkbox-inline"> + <input type="checkbox" name="bizType" value="2"> 出租车 + </label> + <label class="checkbox-inline"> + <input type="checkbox" name="bizType" value="3"> 城际 + </label> + </div> + </div> + + <div class="row" style="margin-top: 10px"> + <label class="col-sm-1 control-label">活动区域:</label> + <div class="col-sm-2"> + <select class="form-control" id="province" onchange="provinceChange(this)"> + <option value="">选择省</option> + @for(obj in provinceList){ + <option value="${obj.code}">${obj.name}</option> + @} + </select> + </div> + <div class="col-sm-2"> + <select class="form-control" id="city" onchange="cityChage(this)"> + <option value="">选择市</option> + </select> + </div> + <div class="col-sm-2"> + <select class="form-control" id="area"> + <option value="">选择区</option> + </select> + </div> + </div> + + <div class="row" style="margin-top: 10px"> + <div class="col-sm-3"> + <#input id="time" name="活动时间" isTime="false"/> + </div> + </div> + + <div class="row"> + <div class="col-sm-3"> + <#input id="commissionRatio" name="抽佣比例" /> + </div> + </div> + <div class="form-group"> + <div class="col-sm-3"> + <#input id="bindingDays" name="绑定有效期" /> + </div> + </div> + <div class="form-group"> + <div class="col-sm-3"> + <label style="font-weight:700">推广活动说明:</label> + + <div class="tab-content"> + <div id="tab-1" class="tab-pane active"> + <div class="panel-body"> + <textarea id="editor_1" type="text/plain" style="width:1200px;height:400px;"></textarea> + </div> + </div> + + </div> + </div> + </div> + + + + + + <div class="row btn-group-m-t"> + <div class="col-sm-10"> + <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="addSubmit()"/> + <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="TDriverPromotionActivityInfoDlg.close()"/> + </div> + </div> + </div> + + </div> +</div> +<script src="${ctxPath}/static/modular/system/tDriverPromotionActivity/tDriverPromotionActivity_info.js"></script> +<script> + function addSubmit() { + var activityTitle = $("#activityTitle").val(); + var bizTypes = []; + $('input[name="bizType"]:checked').each(function() { + bizTypes.push($(this).val()); + }); + var bizTypeValue = bizTypes.join(','); + + var province = $("#province").val(); + var city = $("#city").val(); + var area = $("#area").val(); + var time = $("#time").val(); + var commissionRatio = $("#commissionRatio").val(); + var bindingDays = $("#bindingDays").val(); + var content = editor_1.getContent(); + + + console.log(activityTitle) + console.log(bizTypeValue) + console.log(province) + console.log(city) + console.log(area) + console.log(time) + console.log(commissionRatio) + console.log(bindingDays) + console.log(content) + if(activityTitle==null||activityTitle==''){ + Feng.error("请填写活动标题"); + return; + } + if(bizTypeValue==null||bizTypeValue==''){ + Feng.error("请选择业务类型"); + return; + } + if(province==null||province==''){ + Feng.error("请选择活动区域"); + return; + } + if(city==null||city==''){ + Feng.error("请选择活动区域"); + return; + } + if(area==null||area==''){ + Feng.error("请选择活动区域"); + return; + } + if(time==null||time==''){ + Feng.error("请填写活动时间"); + return; + } + + if(commissionRatio==null||commissionRatio==''){ + Feng.error("请填写抽佣比例"); + return; + } + // 使用正则表达式验证 0-100 的整数 + var commissionRatioReg = /^(?:[1-9]|[1-9][0-9]|100|0)$/; + if (!commissionRatioReg.test(commissionRatio)) { + Feng.error("抽佣比例必须是0-100之间的整数"); + return; + } + if(bindingDays==null||bindingDays==''){ + Feng.error("请填写绑定有效期"); + return; + } + // 使用正则表达式验证大于0的整数 + var bindingDaysReg = /^[1-9]\d*$/; + if (!bindingDaysReg.test(bindingDays)) { + Feng.error("绑定有效期必须是大于0的整数"); + return; + } + if(content==null||content==''){ + Feng.error("请填写活动说明"); + return; + } + + var ajax = new $ax(Feng.ctxPath + "/tDriverPromotionActivity/add", function(data){ + Feng.success("添加成功!"); + TDriverPromotionActivityInfoDlg.close(); + parent.TDriverPromotionActivity.table.refresh(); + },function(data){ + Feng.error("添加失败!" + data.responseJSON.message + "!"); + }); + ajax.set("activityTitle", activityTitle); + ajax.set("bizTypeValue", bizTypeValue); + ajax.set("province", province); + ajax.set("city", city); + ajax.set("area", area); + ajax.set("time", time); + ajax.set("commissionRatio", commissionRatio); + ajax.set("bindingDays", bindingDays); + ajax.set("content", content); + ajax.start(); + + + + + } + + + var editor_1 = null; + $(function () { + //初始化编辑器 + editor_1 = UE.getEditor('editor_1'); + }); + laydate.render({ + elem: '#time' + ,range: true + }); + function provinceChange(e) { + var provinceCode=$(e).val(); + var ajax = new $ax(Feng.ctxPath + "/tCompany/change", function(data){ + if(data!=null){ + var content='<option value="">选择市</option>'; + $.each(data, function(k,v) { + content += "<option value='"+v.code+"'>"+v.name+"</option>"; + }); + $("#city").empty().append(content); + $("#area").empty().append('<option value="">选择区</option>'); + } + }); + ajax.set("code",provinceCode); + ajax.start(); + } + + function cityChage(e) { + var cityCode=$(e).val(); + var ajax = new $ax(Feng.ctxPath + "/tCompany/change", function(data){ + if(data!=null){ + var content='<option value="">选择区</option>'; + $.each(data, function(k,v) { + content += "<option value='"+v.code+"'>"+v.name+"</option>"; + }); + $("#area").empty().append(content); + } + }); + ajax.set("code",cityCode); + ajax.start(); + } +</script> +@} diff --git a/ManagementQYTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/tDriverPromotionActivity/tDriverPromotionActivity_detail.html b/ManagementQYTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/tDriverPromotionActivity/tDriverPromotionActivity_detail.html new file mode 100644 index 0000000..902a54f --- /dev/null +++ b/ManagementQYTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/tDriverPromotionActivity/tDriverPromotionActivity_detail.html @@ -0,0 +1,384 @@ +@layout("/common/_container.html"){ +<head> + <meta charset="UTF-8"> + <title>处理异常订单</title> + <style> + body { + background: #888; + margin: 0; + padding: 0; + } + + .container { + background: #fff; + margin: 20px auto; + padding: 20px 30px; + border-radius: 10px; + max-width: 98vw; + min-width: 1200px; + } + + .title { + font-size: 20px; + font-weight: bold; + margin-bottom: 20px; + } + + .order-table { + width: 100%; + border-collapse: collapse; + margin-bottom: 30px; + } + + .order-table th, + .order-table td { + border: 1px solid #e0e0e0; + padding: 8px 6px; + text-align: center; + font-size: 13px; + } + + .order-table th { + background: #f8f8f8; + font-weight: 600; + } + + .section-title { + font-size: 16px; + font-weight: bold; + margin: 30px 0 10px 0; + } + + .desc-row { + margin-bottom: 10px; + } + + .desc-label { + font-weight: bold; + margin-right: 10px; + } + + .img-list { + display: flex; + gap: 20px; + margin: 10px 0 20px 0; + } + + .img-list img { + width: 120px; + height: 80px; + object-fit: cover; + border-radius: 6px; + border: 1px solid #ccc; + } + + .order-link { + color: #1976d2; + text-decoration: underline; + cursor: pointer; + } + + input[type="radio"] { + accent-color: #1976d2; + width: 18px; + height: 18px; + vertical-align: middle; + margin-right: 4px; + } + + .radio-group label { + margin-right: 18px; + font-size: 15px; + cursor: pointer; + } + + #duty-selector { + display: flex; + margin-bottom: 18px; + border: 1px solid #ccc; + border-radius: 4px; + overflow: hidden; + width: fit-content; + } + + + .duty-btn { + flex: 1 1 0; + padding: 12px 32px; + border: none; + background: #fff; + color: #222; + font-size: 16px; + cursor: pointer; + outline: none; + border-right: 1px solid #ccc; + transition: background 0.2s, color 0.2s; + height: 62px; + line-height: 24px; + } + + .duty-btn:last-child { + border-right: none; + } + + .duty-btn.active { + background: #1976d2; + color: #fff; + font-weight: bold; + } + + .action-btn { + min-width: 140px; + height: 48px; + background: #1976d2; + color: #fff; + border: none; + border-radius: 5px; + font-size: 16px; + font-weight: bold; + margin-right: 18px; + cursor: pointer; + transition: background 0.2s, box-shadow 0.2s; + box-shadow: 0 2px 6px rgba(25, 118, 210, 0.08); + } + + .action-btn:last-child { + margin-right: 0; + } + + .action-btn:hover { + background: #1565c0; + } + + #action-btns { + margin-top: 32px; + display: flex; + align-items: center; + } + </style> +</head> +<div class="ibox float-e-margins"> + <div class="ibox-content"> + <div class="form-horizontal"> + <input type="hidden" id="id" value="${item.id!}"/> + + <div id="duty-selector"> + <button type="button" class="duty-btn active" data-type="platformAll">活动基础信息</button> + <button type="button" class="duty-btn" data-type="driverAll">推广情况</button> + </div> + <div id="s1"> + <div class="row"> + <div class="col-sm-4"> + <#input id="activityTitle" name="推广活动标题" value="${item.activityTitle}"/> + </div> + </div> + + <div class="row" style="margin-left: -24px"> + <label class="col-sm-1 control-label">关联业务:</label> + <div class="col-sm-3"> + <label class="checkbox-inline"> + <input type="checkbox" name="bizType" value="1"> 专车 + </label> + <label class="checkbox-inline"> + <input type="checkbox" name="bizType" value="2"> 出租车 + </label> + <label class="checkbox-inline"> + <input type="checkbox" name="bizType" value="3"> 城际 + </label> + </div> + </div> + + <div class="row" style="margin-top: 10px"> + <label class="col-sm-1 control-label">活动区域:</label> + <div class="col-sm-2"> + <select class="form-control" id="province" onchange="provinceChange(this)"> + <option value="">选择省</option> + @for(obj in provinceList){ + <option value="${obj.code}" ${obj.code== item.provinceCode ? + 'selected=selected' : ''}>${obj.name}</option> + @} + </select> + </div> + <div class="col-sm-2"> + <select class="form-control" id="city" onchange="cityChage(this)"> + <option value="">选择市</option> + @for(obj in cityList){ + <option value="${obj.code}" ${obj.code== item.cityCode ? + 'selected=selected' : ''}>${obj.name}</option> + @} + </select> + </div> + <div class="col-sm-2"> + <select class="form-control" id="area"> + <option value="">选择区</option> + @for(obj in areaList){ + <option value="${obj.code}" ${obj.code== item.districtCode ? + 'selected=selected' : ''}>${obj.name}</option> + @} + </select> + </div> + </div> + + <div class="row" style="margin-top: 10px"> + <div class="col-sm-3"> + <#input id="time" name="活动时间" isTime="false"/> + </div> + </div> + + <div class="row"> + <div class="col-sm-3"> + <#input id="commissionRatio" name="抽佣比例" /> + </div> + </div> + <div class="form-group"> + <div class="col-sm-3"> + <#input id="bindingDays" name="绑定有效期" /> + </div> + </div> + <div class="form-group"> + <div class="col-sm-3"> + <label style="font-weight:700">推广活动说明:</label> + + <div class="tab-content"> + <div id="tab-1" class="tab-pane active"> + <div class="panel-body"> + <textarea id="editor_1" type="text/plain" + style="width:1200px;height:400px;"></textarea> + </div> + </div> + + </div> + </div> + </div> + </div> + </div> + + + <div id="s2"> + <div class="ibox-content"> + <div class="row row-lg"> + <div class="col-sm-12"> + <div class="row"> + <div class="col-sm-3"> + <#NameCon id="driverName" name="司机姓名" /> + </div> + + <div class="col-sm-3"> + <#button name="搜索" icon="fa-search" clickFun="TDriverPromotionActivity.search()"/> + <#button name="重置" icon="fa-trash" clickFun="TDriverPromotionActivity.resetSearch()" + space="true"/> + </div> + </div> + <div class="hidden-xs" id="TOrderPrivateCarTableToolbar" role="group"> + <#button name="导出Excel" icon="" clickFun="TDriverPromotionActivity.exportExcel()" space="true"/> + </div> + <#table id="TDriverPromotionActivityTable"/> + </div> + </div> + </div> + </div> + </div> + +</div> +</div> +<script src="${ctxPath}/static/modular/system/tDriverPromotionActivity/tDriverPromotionActivity1.js"></script> +<script src="${ctxPath}/static/modular/system/tDriverPromotionActivity/tDriverPromotionActivity_info.js"></script> +<script> + + + // 在现有的 script 标签内添加以下代码 + $(document).ready(function () { + // 处理 duty-selector 按钮点击事件 + $('#duty-selector .duty-btn').on('click', function () { + // 移除所有按钮的 active 类 + $('#duty-selector .duty-btn').removeClass('active'); + // 为当前点击的按钮添加 active 类 + $(this).addClass('active'); + + // 可以根据 data-type 值执行不同的操作 + var selectedType = $(this).data('type'); + if (selectedType === 'platformAll') { + // 处理活动基础信息选中逻辑 + console.log('活动基础信息被选中'); + $("#s1").show(); + $("#s2").hide(); + } else if (selectedType === 'driverAll') { + // 处理推广情况选中逻辑 + console.log('推广情况被选中'); + $("#s1").hide(); + $("#s2").show(); + } + }); + }); + $(function () { + $("#s1").show(); + $("#s2").hide(); + + // 初始化编辑器 + editor_1 = UE.getEditor('editor_1'); + + // 初始化活动时间 + laydate.render({ + elem: '#time', + range: true + }); + + // 回显关联业务 + var bizTypeStr = "${item.bizType!}"; // 获取业务类型字符串 + if (bizTypeStr) { + var bizTypes = bizTypeStr.split(','); + $('input[name="bizType"]').each(function () { + if (bizTypes.indexOf($(this).val()) !== -1) { + $(this).prop('checked', true); + } + }); + } + + // 回显活动时间 + $("#time").val("${time!}"); + + // 回显抽佣比例和绑定有效期 + $("#commissionRatio").val("${item.commissionRatio!}"); + $("#bindingDays").val("${item.bindingDays!}"); + + // 回显活动说明 + setTimeout(function () { + editor_1.ready(function () { + editor_1.setContent('${item.activityDesc!}'); + }); + }, 100); + }); + + + function provinceChange(e) { + var provinceCode = $(e).val(); + var ajax = new $ax(Feng.ctxPath + "/tCompany/change", function (data) { + if (data != null) { + var content = '<option value="">选择市</option>'; + $.each(data, function (k, v) { + content += "<option value='" + v.code + "'>" + v.name + "</option>"; + }); + $("#city").empty().append(content); + $("#area").empty().append('<option value="">选择区</option>'); + } + }); + ajax.set("code", provinceCode); + ajax.start(); + } + + function cityChage(e) { + var cityCode = $(e).val(); + var ajax = new $ax(Feng.ctxPath + "/tCompany/change", function (data) { + if (data != null) { + var content = '<option value="">选择区</option>'; + $.each(data, function (k, v) { + content += "<option value='" + v.code + "'>" + v.name + "</option>"; + }); + $("#area").empty().append(content); + } + }); + ajax.set("code", cityCode); + ajax.start(); + } +</script> +@} diff --git a/ManagementQYTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/tDriverPromotionActivity/tDriverPromotionActivity_edit.html b/ManagementQYTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/tDriverPromotionActivity/tDriverPromotionActivity_edit.html new file mode 100644 index 0000000..1592838 --- /dev/null +++ b/ManagementQYTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/tDriverPromotionActivity/tDriverPromotionActivity_edit.html @@ -0,0 +1,268 @@ +@layout("/common/_container.html"){ +<div class="ibox float-e-margins"> + <div class="ibox-content"> + <div class="form-horizontal"> + <input type="hidden" id="id" value="${item.id!}"/> + <div class="row"> + <div class="col-sm-4"> + <#input id="activityTitle" name="推广活动标题" value="${item.activityTitle}"/> + </div> + </div> + + <div class="row" style="margin-left: -24px"> + <label class="col-sm-1 control-label">关联业务:</label> + <div class="col-sm-3"> + <label class="checkbox-inline"> + <input type="checkbox" name="bizType" value="1"> 专车 + </label> + <label class="checkbox-inline"> + <input type="checkbox" name="bizType" value="2"> 出租车 + </label> + <label class="checkbox-inline"> + <input type="checkbox" name="bizType" value="3"> 城际 + </label> + </div> + </div> + + <div class="row" style="margin-top: 10px"> + <label class="col-sm-1 control-label">活动区域:</label> + <div class="col-sm-2"> + <select class="form-control" id="province" onchange="provinceChange(this)"> + <option value="">选择省</option> + @for(obj in provinceList){ + <option value="${obj.code}" ${obj.code == item.provinceCode ? 'selected=selected' : ''}>${obj.name}</option> + @} + </select> + </div> + <div class="col-sm-2"> + <select class="form-control" id="city" onchange="cityChage(this)"> + <option value="">选择市</option> + @for(obj in cityList){ + <option value="${obj.code}" ${obj.code == item.cityCode ? 'selected=selected' : ''}>${obj.name}</option> + @} + </select> + </div> + <div class="col-sm-2"> + <select class="form-control" id="area"> + <option value="">选择区</option> + @for(obj in areaList){ + <option value="${obj.code}" ${obj.code == item.districtCode ? 'selected=selected' : ''}>${obj.name}</option> + @} + </select> + </div> + </div> + + <div class="row" style="margin-top: 10px"> + <div class="col-sm-3"> + <#input id="time" name="活动时间" isTime="false"/> + </div> + </div> + + <div class="row"> + <div class="col-sm-3"> + <#input id="commissionRatio" name="抽佣比例" /> + </div> + </div> + <div class="form-group"> + <div class="col-sm-3"> + <#input id="bindingDays" name="绑定有效期" /> + </div> + </div> + <div class="form-group"> + <div class="col-sm-3"> + <label style="font-weight:700">推广活动说明:</label> + + <div class="tab-content"> + <div id="tab-1" class="tab-pane active"> + <div class="panel-body"> + <textarea id="editor_1" type="text/plain" style="width:1200px;height:400px;"></textarea> + </div> + </div> + + </div> + </div> + </div> + <div class="row btn-group-m-t"> + <div class="col-sm-10"> + <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="editSubmit()"/> + <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="TDriverPromotionActivityInfoDlg.close()"/> + </div> + </div> + </div> + + </div> +</div> +<script src="${ctxPath}/static/modular/system/tDriverPromotionActivity/tDriverPromotionActivity_info.js"></script> +<script> + $(function() { + // 初始化编辑器 + editor_1 = UE.getEditor('editor_1'); + + // 初始化活动时间 + laydate.render({ + elem: '#time', + range: true + }); + + // 回显关联业务 + var bizTypeStr = "${item.bizType!}"; // 获取业务类型字符串 + if (bizTypeStr) { + var bizTypes = bizTypeStr.split(','); + $('input[name="bizType"]').each(function() { + if (bizTypes.indexOf($(this).val()) !== -1) { + $(this).prop('checked', true); + } + }); + } + + + + + // 回显活动时间 + $("#time").val("${time!}"); + + // 回显抽佣比例和绑定有效期 + $("#commissionRatio").val("${item.commissionRatio!}"); + $("#bindingDays").val("${item.bindingDays!}"); + + // 回显活动说明 + setTimeout(function() { + editor_1.ready(function() { + editor_1.setContent('${item.activityDesc!}'); + }); + }, 100); + }); + + function editSubmit() { + var activityTitle = $("#activityTitle").val(); + var bizTypes = []; + $('input[name="bizType"]:checked').each(function() { + bizTypes.push($(this).val()); + }); + var bizTypeValue = bizTypes.join(','); + + var province = $("#province").val(); + var city = $("#city").val(); + var area = $("#area").val(); + var time = $("#time").val(); + var id = $("#id").val(); + var commissionRatio = $("#commissionRatio").val(); + var bindingDays = $("#bindingDays").val(); + var content = editor_1.getContent(); + + + + console.log(activityTitle) + console.log(bizTypeValue) + console.log(province) + console.log(city) + console.log(area) + console.log(time) + console.log(commissionRatio) + console.log(bindingDays) + console.log(content) + if(activityTitle==null||activityTitle==''){ + Feng.error("请填写活动标题"); + return; + } + if(bizTypeValue==null||bizTypeValue==''){ + Feng.error("请选择业务类型"); + return; + } + if(province==null||province==''){ + Feng.error("请选择活动区域"); + return; + } + if(city==null||city==''){ + Feng.error("请选择活动区域"); + return; + } + if(area==null||area==''){ + Feng.error("请选择活动区域"); + return; + } + if(time==null||time==''){ + Feng.error("请填写活动时间"); + return; + } + + if(commissionRatio==null||commissionRatio==''){ + Feng.error("请填写抽佣比例"); + return; + } + // 使用正则表达式验证 0-100 的整数 + var commissionRatioReg = /^(?:[1-9]|[1-9][0-9]|100|0)$/; + if (!commissionRatioReg.test(commissionRatio)) { + Feng.error("抽佣比例必须是0-100之间的整数"); + return; + } + if(bindingDays==null||bindingDays==''){ + Feng.error("请填写绑定有效期"); + return; + } + // 使用正则表达式验证大于0的整数 + var bindingDaysReg = /^[1-9]\d*$/; + if (!bindingDaysReg.test(bindingDays)) { + Feng.error("绑定有效期必须是大于0的整数"); + return; + } + if(content==null||content==''){ + Feng.error("请填写活动说明"); + return; + } + + var ajax = new $ax(Feng.ctxPath + "/tDriverPromotionActivity/update", function(data){ + Feng.success("编辑成功!"); + TDriverPromotionActivityInfoDlg.close(); + parent.TDriverPromotionActivity.table.refresh(); + },function(data){ + Feng.error("编辑失败!" + data.responseJSON.message + "!"); + }); + ajax.set("id", id); + ajax.set("activityTitle", activityTitle); + ajax.set("bizTypeValue", bizTypeValue); + ajax.set("province", province); + ajax.set("city", city); + ajax.set("area", area); + ajax.set("time", time); + ajax.set("commissionRatio", commissionRatio); + ajax.set("bindingDays", bindingDays); + ajax.set("content", content); + ajax.start(); + + + } + + + function provinceChange(e) { + var provinceCode=$(e).val(); + var ajax = new $ax(Feng.ctxPath + "/tCompany/change", function(data){ + if(data!=null){ + var content='<option value="">选择市</option>'; + $.each(data, function(k,v) { + content += "<option value='"+v.code+"'>"+v.name+"</option>"; + }); + $("#city").empty().append(content); + $("#area").empty().append('<option value="">选择区</option>'); + } + }); + ajax.set("code",provinceCode); + ajax.start(); + } + + function cityChage(e) { + var cityCode=$(e).val(); + var ajax = new $ax(Feng.ctxPath + "/tCompany/change", function(data){ + if(data!=null){ + var content='<option value="">选择区</option>'; + $.each(data, function(k,v) { + content += "<option value='"+v.code+"'>"+v.name+"</option>"; + }); + $("#area").empty().append(content); + } + }); + ajax.set("code",cityCode); + ajax.start(); + } +</script> +@} diff --git a/ManagementQYTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/tPromotionOrderCar/tPromotionOrder.html b/ManagementQYTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/tPromotionOrderCar/tPromotionOrder.html new file mode 100644 index 0000000..8027935 --- /dev/null +++ b/ManagementQYTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/tPromotionOrderCar/tPromotionOrder.html @@ -0,0 +1,121 @@ +@layout("/common/_container.html"){ +<div class="row"> + <div class="col-sm-12"> + <div class="ibox float-e-margins"> + <div class="ibox-title"> + <h5>推广收益明细</h5> + </div> + <div class="ibox-content"> + <div class="row row-lg"> + <div class="col-sm-12"> + <div class="row"> + <div class="col-sm-3"> + <#TimeCon id="insertTime" name="收益时间" isTime="false"/> + </div> + <div class="col-sm-3"> + <#NameCon id="name" name="活动名称" /> + </div> + <div class="col-sm-3"> + <#NameCon id="driverName" name="司机名称" /> + </div> + <div class="col-sm-3"> + <#NameCon id="userName" name="用户名称" /> + </div> + <div class="col-sm-3"> + <#NameCon id="orderNum" name="订单编号" /> + </div> + + <div class="col-sm-3"> + <#button name="搜索" icon="fa-search" clickFun="search()"/> + <#button name="重置" icon="fa-trash" clickFun="resetSearch()" space="true"/> + </div> + </div> + + <div class="form-group"> + <div class="row"> + <div class="col-sm-6"> + <div class="stat-card" style=" border: none; padding: 20px; border-radius: 10px; margin-bottom: 15px; box-shadow: 0 4px 15px rgba(0,0,0,0.1);"> + <div class="stat-content"> + <div class="stat-number" style="font-size: 28px; font-weight: bold; margin-bottom: 5px;" id="money"> + ${money} + </div> + <div class="stat-label" style="font-size: 14px; opacity: 0.9;"> + 合计推广收益金额 + </div> + </div> + <div style="clear: both;"></div> + </div> + </div> + <div class="col-sm-6"> + <div class="stat-card" style=" border: none; padding: 20px; border-radius: 10px; margin-bottom: 15px; box-shadow: 0 4px 15px rgba(0,0,0,0.1);"> + <div class="stat-content"> + <div class="stat-number" style="font-size: 28px; font-weight: bold; margin-bottom: 5px;" id="size"> + ${size} + </div> + <div class="stat-label" style="font-size: 14px; opacity: 0.9;"> + 合计推广收益笔数 + </div> + </div> + <div style="clear: both;"></div> + </div> + </div> + </div> + </div> + + <div class="hidden-xs" id="TOrderPrivateCarTableToolbar" role="group"> + <#button name="导出Excel" icon="" clickFun="TAbnormalOrder.exportExcel()" space="true"/> + </div> + <#table id="TOrderPrivateCarTable"/> + </div> + </div> + </div> + </div> + </div> +</div> +<script src="${ctxPath}/static/modular/system/tPromotionOrderCar/tPromotionOrder.js"></script> +<script> + laydate.render({ + elem: '#insertTime' + ,range: true + }); + + function search() { + + let insertTime = $('#insertTime').val(); + let name = $('#name').val(); + let driverName = $('#driverName').val(); + let userName = $('#userName').val(); + let orderNum = $('#orderNum').val(); + + + //提交信息 + var ajax = new $ax(Feng.ctxPath + "/promotionInfo/list1", function(data){ + console.log(data) + $("#money").text(data.money) + $("#size").text(data.size) + },function(data){ + }); + ajax.set("insertTime",insertTime); + ajax.set("name",name); + ajax.set("driverName",driverName); + ajax.set("userName",userName); + ajax.set("orderNum",orderNum); + ajax.start(); + TAbnormalOrder.search() + } + + + function resetSearch() { + + //提交信息 + var ajax = new $ax(Feng.ctxPath + "/promotionInfo/list1", function(data){ + console.log(data) + $("#money").text(data.money) + $("#size").text(data.size) + },function(data){ + }); + ajax.start(); + TAbnormalOrder.resetSearch() + } +</script> +@} diff --git a/ManagementQYTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/tSysReformist/tSysReformist.html b/ManagementQYTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/tSysReformist/tSysReformist.html index 5c41fc9..2188e2f 100644 --- a/ManagementQYTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/tSysReformist/tSysReformist.html +++ b/ManagementQYTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/tSysReformist/tSysReformist.html @@ -43,7 +43,7 @@ <div> <div style="float: left;"> <label class="lab checked" onclick="checkedLable(this)" tag="pushOrderSettings">推单设置</label> - <label class="lab" onclick="checkedLable(this)" tag="driverPayDays">司机分账账期设置</label> +<!-- <label class="lab" onclick="checkedLable(this)" tag="driverPayDays">司机分账账期设置</label>--> <label class="lab" onclick="checkedLable(this)" tag="cancelOrderSettings">取消订单设置</label> <label class="lab" onclick="checkedLable(this)" tag="cancelTheReservationOrderSetting">预约单取消设置</label> <label class="lab" onclick="checkedLable(this)" tag="spellOrderSetting">拼单派单设置</label> diff --git a/ManagementQYTTravel/guns-admin/src/main/webapp/static/modular/system/tDriverPromotionActivity/tDriverPromotionActivity.js b/ManagementQYTTravel/guns-admin/src/main/webapp/static/modular/system/tDriverPromotionActivity/tDriverPromotionActivity.js new file mode 100644 index 0000000..0dac890 --- /dev/null +++ b/ManagementQYTTravel/guns-admin/src/main/webapp/static/modular/system/tDriverPromotionActivity/tDriverPromotionActivity.js @@ -0,0 +1,209 @@ +/** + * 管理初始化 + */ +var TDriverPromotionActivity = { + id: "TDriverPromotionActivityTable", //表格id + seItem: null, //选中的条目 + table: null, + layerIndex: -1 +}; + +/** + * 初始化表格的列 + */ +TDriverPromotionActivity.initColumn = function () { + return [ + {field: 'selectItem', radio: true}, + {title: '推广活动ID', field: 'id', visible: false, align: 'center', valign: 'middle'}, + {title: '添加时间', field: 'createTime', visible: true, align: 'center', valign: 'middle'}, + { + title: '活动区域-省', field: 'province', visible: true, align: 'center', valign: 'middle', + + formatter: function (value, row, index) { + if (row.province != null && row.city != null && row.district != null) { + return row.province + "-" + row.city + "-" + row.district; + } + if (row.province != null && row.city != null) { + return row.province + "-" + row.city; + } + if (row.province != null) { + return row.province; + } + + } + }, + {title: '活动名称', field: 'activityTitle', visible: true, align: 'center', valign: 'middle'}, + { + title: '活动时间', field: 'startTime', visible: true, align: 'center', valign: 'middle', + + formatter: function (value, row, index) { + return row.startTime + " - " + row.endTime; + } + + }, + {title: '当前状态', field: 'status', visible: true, align: 'center', valign: 'middle', + formatter: function (value, row, index) { + return {1:"已开启",2:"暂停",3:"未开启",4:"已结束"}[value]; + } + }, + { + title: '操作', field: 'opt', visible: true, align: 'left', valign: 'middle', width: "10%", + formatter: function (value, row) { + if(row.status==1){ + var btn = []; + btn += '<a href="javascript:void(0);" onclick="TDriverPromotionActivity.stop(' + row.id + ')" style="color: #0e9aef">暂停</a> '; + btn += '<a href="javascript:void(0);" onclick="TDriverPromotionActivity.info(' + row.id + ')" style="color: #0e9aef">详情</a> '; + return btn; + } + if(row.status==2){ + var btn = []; + btn += '<a href="javascript:void(0);" onclick="TDriverPromotionActivity.start(' + row.id + ')" style="color: #0e9aef">开启</a> '; + btn += '<a href="javascript:void(0);" onclick="TDriverPromotionActivity.info(' + row.id + ')" style="color: #0e9aef">详情</a> '; + btn += '<a href="javascript:void(0);" onclick="TDriverPromotionActivity.update(' + row.id + ')" style="color: #0e9aef">编辑</a> '; + return btn; + } + if(row.status==3){ + var btn = []; + btn += '<a href="javascript:void(0);" onclick="TDriverPromotionActivity.info(' + row.id + ')" style="color: #0e9aef">详情</a> '; + btn += '<a href="javascript:void(0);" onclick="TDriverPromotionActivity.update(' + row.id + ')" style="color: #0e9aef">编辑</a> '; + btn += '<a href="javascript:void(0);" onclick="TDriverPromotionActivity.delete(' + row.id + ')" style="color: #0e9aef">删除</a> '; + return btn; + } + if(row.status==4){ + var btn = []; + btn += '<a href="javascript:void(0);" onclick="TDriverPromotionActivity.info(' + row.id + ')">详情</a> '; + btn += '<a href="javascript:void(0);" onclick="TDriverPromotionActivity.delete(' + row.id + ')">删除</a> '; + return btn; + } + + } + } + + ]; +}; + +/** + * 检查是否选中 + */ +TDriverPromotionActivity.check = function () { + var selected = $('#' + this.id).bootstrapTable('getSelections'); + if (selected.length == 0) { + Feng.info("请先选中表格中的某一记录!"); + return false; + } else { + TDriverPromotionActivity.seItem = selected[0]; + return true; + } +}; + +/** + * 点击添加 + */ +TDriverPromotionActivity.openAddTDriverPromotionActivity = function () { + var index = layer.open({ + type: 2, + title: '添加', + area: ['100%', '100%'], //宽高 + fix: false, //不固定 + maxmin: true, + content: Feng.ctxPath + '/tDriverPromotionActivity/tDriverPromotionActivity_add' + }); + this.layerIndex = index; +}; + +/** + * 打开查看详情 + */ +TDriverPromotionActivity.update = function (e) { + var index = layer.open({ + type: 2, + title: '编辑', + area: ['100%', '100%'], //宽高 + fix: false, //不固定 + maxmin: true, + content: Feng.ctxPath + '/tDriverPromotionActivity/tDriverPromotionActivity_update/' + e + }); + this.layerIndex = index; +}; +TDriverPromotionActivity.info = function (e) { + var index = layer.open({ + type: 2, + title: '编辑', + area: ['100%', '100%'], //宽高 + fix: false, //不固定 + maxmin: true, + content: Feng.ctxPath + '/tDriverPromotionActivity/tDriverPromotionActivity_info/' + e + }); + this.layerIndex = index; +}; + +/** + * 删除 + */ +TDriverPromotionActivity.delete = function (e) { + var ajax = new $ax(Feng.ctxPath + "/tDriverPromotionActivity/delete", function (data) { + Feng.success("删除成功!"); + TDriverPromotionActivity.table.refresh(); + }, function (data) { + Feng.error("删除失败!" + data.responseJSON.message + "!"); + }); + ajax.set("tDriverPromotionActivityId", e); + ajax.start(); +}; +TDriverPromotionActivity.stop = function (e) { + var ajax = new $ax(Feng.ctxPath + "/tDriverPromotionActivity/stop", function (data) { + Feng.success("暂停成功!"); + TDriverPromotionActivity.table.refresh(); + }, function (data) { + Feng.error("暂停失败!" + data.responseJSON.message + "!"); + }); + ajax.set("id", e); + ajax.start(); +}; + +TDriverPromotionActivity.start = function (e) { + var ajax = new $ax(Feng.ctxPath + "/tDriverPromotionActivity/start", function (data) { + Feng.success("暂停成功!"); + TDriverPromotionActivity.table.refresh(); + }, function (data) { + Feng.error("暂停失败!" + data.responseJSON.message + "!"); + }); + ajax.set("id", e); + ajax.start(); +}; + + +TDriverPromotionActivity.startOrStop = function () { + if (this.check()) { + if (TDriverPromotionActivity.seItem.status == 1) { + TDriverPromotionActivity.stop(TDriverPromotionActivity.seItem.id); + } else { + TDriverPromotionActivity.start(TDriverPromotionActivity.seItem.id); + } + } +}; + +/** + * 查询列表 + */ +TDriverPromotionActivity.search = function () { + var queryData = {}; + queryData['insertTime'] = $("#insertTime").val(); + queryData['name'] = $("#name").val(); + queryData['status'] = $("#status").val(); + TDriverPromotionActivity.table.refresh({query: queryData}); +}; +TDriverPromotionActivity.research = function () { + $("#insertTime").val(''); + $("#name").val(''); + $("#status").val(''); + TDriverPromotionActivity.search() +}; + + +$(function () { + var defaultColunms = TDriverPromotionActivity.initColumn(); + var table = new BSTable(TDriverPromotionActivity.id, "/tDriverPromotionActivity/list", defaultColunms); + table.setPaginationType("client"); + TDriverPromotionActivity.table = table.init(); +}); diff --git a/ManagementQYTTravel/guns-admin/src/main/webapp/static/modular/system/tDriverPromotionActivity/tDriverPromotionActivity1.js b/ManagementQYTTravel/guns-admin/src/main/webapp/static/modular/system/tDriverPromotionActivity/tDriverPromotionActivity1.js new file mode 100644 index 0000000..d8dd13b --- /dev/null +++ b/ManagementQYTTravel/guns-admin/src/main/webapp/static/modular/system/tDriverPromotionActivity/tDriverPromotionActivity1.js @@ -0,0 +1,196 @@ +/** + * 管理初始化 + */ +var TDriverPromotionActivity = { + id: "TDriverPromotionActivityTable", //表格id + seItem: null, //选中的条目 + table: null, + layerIndex: -1 +}; + +/** + * 初始化表格的列 + */ +TDriverPromotionActivity.initColumn = function () { + return [ + {field: 'selectItem', radio: true}, + {title: '推广排名', field: 'sort', visible: true, align: 'center', valign: 'middle', + formatter: function (value, row, index) { + // 使用序号作为排名,index从0开始,所以需要+1 + return index + 1; + } + }, + {title: '司机Id', field: 'driverId', visible: false, align: 'center', valign: 'middle'}, + {title: '司机姓名', field: 'driverName', visible: true, align: 'center', valign: 'middle'}, + {title: '推广用户数量', field: 'userNum', visible: true, align: 'center', valign: 'middle'}, + {title: '推广收益合计', field: 'money', visible: true, align: 'center', valign: 'middle', + }, + { + title: '操作', field: 'opt', visible: true, align: 'left', valign: 'middle', width: "10%", + formatter: function (value, row) { + var btn = []; + btn += '<a href="javascript:void(0);" onclick="TDriverPromotionActivity.viewUser(' + row.driverId + ')" style="color: #0e9aef">查看下级用户</a> '; + btn += '<a href="javascript:void(0);" onclick="TDriverPromotionActivity.info(' + row.id + ')" style="color: #0e9aef">查看收益明细</a> '; + return btn; + } + + } + + ]; +}; + +/** + * 检查是否选中 + */ +TDriverPromotionActivity.check = function () { + var selected = $('#' + this.id).bootstrapTable('getSelections'); + if (selected.length == 0) { + Feng.info("请先选中表格中的某一记录!"); + return false; + } else { + TDriverPromotionActivity.seItem = selected[0]; + return true; + } +}; + +/** + * 点击添加 + */ +TDriverPromotionActivity.openAddTDriverPromotionActivity = function () { + var index = layer.open({ + type: 2, + title: '添加', + area: ['100%', '100%'], //宽高 + fix: false, //不固定 + maxmin: true, + content: Feng.ctxPath + '/tDriverPromotionActivity/tDriverPromotionActivity_add' + }); + this.layerIndex = index; +}; + + +/** + * 打开查看详情 + */ +TDriverPromotionActivity.viewUser = function (e) { + var index = layer.open({ + type: 2, + title: '司机推广下级用户', + area: ['100%', '100%'], //宽高 + fix: false, //不固定 + maxmin: true, + content: Feng.ctxPath + '/tDriverPromotionActivity/tDriverPromotionActivity_viewUser/' + e + }); + this.layerIndex = index; +}; + + +/** + * 打开查看详情 + */ +TDriverPromotionActivity.update = function (e) { + var index = layer.open({ + type: 2, + title: '编辑', + area: ['100%', '100%'], //宽高 + fix: false, //不固定 + maxmin: true, + content: Feng.ctxPath + '/tDriverPromotionActivity/tDriverPromotionActivity_update/' + e + }); + this.layerIndex = index; +}; +TDriverPromotionActivity.info = function (e) { + var index = layer.open({ + type: 2, + title: '编辑', + area: ['100%', '100%'], //宽高 + fix: false, //不固定 + maxmin: true, + content: Feng.ctxPath + '/tDriverPromotionActivity/tDriverPromotionActivity_info/' + e + }); + this.layerIndex = index; +}; + +/** + * 删除 + */ +TDriverPromotionActivity.delete = function (e) { + var ajax = new $ax(Feng.ctxPath + "/tDriverPromotionActivity/delete", function (data) { + Feng.success("删除成功!"); + TDriverPromotionActivity.table.refresh(); + }, function (data) { + Feng.error("删除失败!" + data.responseJSON.message + "!"); + }); + ajax.set("tDriverPromotionActivityId", e); + ajax.start(); +}; +TDriverPromotionActivity.stop = function (e) { + var ajax = new $ax(Feng.ctxPath + "/tDriverPromotionActivity/stop", function (data) { + Feng.success("暂停成功!"); + TDriverPromotionActivity.table.refresh(); + }, function (data) { + Feng.error("暂停失败!" + data.responseJSON.message + "!"); + }); + ajax.set("id", e); + ajax.start(); +}; + +TDriverPromotionActivity.start = function (e) { + var ajax = new $ax(Feng.ctxPath + "/tDriverPromotionActivity/start", function (data) { + Feng.success("暂停成功!"); + TDriverPromotionActivity.table.refresh(); + }, function (data) { + Feng.error("暂停失败!" + data.responseJSON.message + "!"); + }); + ajax.set("id", e); + ajax.start(); +}; + + +TDriverPromotionActivity.startOrStop = function () { + if (this.check()) { + if (TDriverPromotionActivity.seItem.status == 1) { + TDriverPromotionActivity.stop(TDriverPromotionActivity.seItem.id); + } else { + TDriverPromotionActivity.start(TDriverPromotionActivity.seItem.id); + } + } +}; + +/** + * 查询列表 + */ +TDriverPromotionActivity.search = function () { + var queryData = {}; + queryData['driverName'] = $("#driverName").val(); + queryData['id'] = $("#id").val(); + TDriverPromotionActivity.table.refresh({query: queryData}); +}; +TDriverPromotionActivity.resetSearch = function () { + $("#driverName").val(''); + TDriverPromotionActivity.search() +}; +TDriverPromotionActivity.exportExcel = function () { + let p = ""; + let id = $('#id').val(); + let driverName = $('#driverName').val(); + if(null != id && '' != id){ + p += "id=" + id + "&"; + } + if(null != driverName && '' != driverName){ + p += "driverName=" + driverName + "&"; + } + if('' != p){ + p = "?" + p.substring(0, p.length - 1); + } + console.log('p['+p+']') + window.location.href = Feng.ctxPath + '/tDriverPromotionActivity/export' + p; +}; + + +$(function () { + var defaultColunms = TDriverPromotionActivity.initColumn(); + var table = new BSTable(TDriverPromotionActivity.id, "/tDriverPromotionActivity/list1", defaultColunms); + table.setPaginationType("client"); + TDriverPromotionActivity.table = table.init(); +}); diff --git a/ManagementQYTTravel/guns-admin/src/main/webapp/static/modular/system/tDriverPromotionActivity/tDriverPromotionActivity2.js b/ManagementQYTTravel/guns-admin/src/main/webapp/static/modular/system/tDriverPromotionActivity/tDriverPromotionActivity2.js new file mode 100644 index 0000000..366c9e0 --- /dev/null +++ b/ManagementQYTTravel/guns-admin/src/main/webapp/static/modular/system/tDriverPromotionActivity/tDriverPromotionActivity2.js @@ -0,0 +1,191 @@ +/** + * 管理初始化 + */ +var TDriverPromotionActivity = { + id: "TDriverPromotionActivityTable", //表格id + seItem: null, //选中的条目 + table: null, + layerIndex: -1 +}; + +/** + * 初始化表格的列 + */ +TDriverPromotionActivity.initColumn = function () { + return [ + {field: 'selectItem', radio: true}, + {title: '序号', field: 'sort', visible: true, align: 'center', valign: 'middle', + formatter: function (value, row, index) { + // 使用序号作为排名,index从0开始,所以需要+1 + return index + 1; + } + }, + {title: '用户Id', field: 'userId', visible: true, align: 'center', valign: 'middle'}, + {title: '用户昵称', field: 'userName', visible: true, align: 'center', valign: 'middle'}, + {title: '用户手机号', field: 'userPhone', visible: true, align: 'center', valign: 'middle'}, + {title: '绑定时间', field: 'bindDate', visible: true, align: 'center', valign: 'middle', + }, + {title: '有效期至', field: 'bindExpireDate', visible: true, align: 'center', valign: 'middle', + }, + {title: '产生收益合计', field: 'money', visible: true, align: 'center', valign: 'middle', + }, + + ]; +}; + +/** + * 检查是否选中 + */ +TDriverPromotionActivity.check = function () { + var selected = $('#' + this.id).bootstrapTable('getSelections'); + if (selected.length == 0) { + Feng.info("请先选中表格中的某一记录!"); + return false; + } else { + TDriverPromotionActivity.seItem = selected[0]; + return true; + } +}; + +/** + * 点击添加 + */ +TDriverPromotionActivity.openAddTDriverPromotionActivity = function () { + var index = layer.open({ + type: 2, + title: '添加', + area: ['100%', '100%'], //宽高 + fix: false, //不固定 + maxmin: true, + content: Feng.ctxPath + '/tDriverPromotionActivity/tDriverPromotionActivity_add' + }); + this.layerIndex = index; +}; + + +/** + * 打开查看详情 + */ +TDriverPromotionActivity.viewUser = function (e) { + var index = layer.open({ + type: 2, + title: '司机推广下级用户', + area: ['100%', '100%'], //宽高 + fix: false, //不固定 + maxmin: true, + content: Feng.ctxPath + '/tDriverPromotionActivity/tDriverPromotionActivity_viewUser/' + e + }); + this.layerIndex = index; +}; + + +/** + * 打开查看详情 + */ +TDriverPromotionActivity.update = function (e) { + var index = layer.open({ + type: 2, + title: '编辑', + area: ['100%', '100%'], //宽高 + fix: false, //不固定 + maxmin: true, + content: Feng.ctxPath + '/tDriverPromotionActivity/tDriverPromotionActivity_update/' + e + }); + this.layerIndex = index; +}; +TDriverPromotionActivity.info = function (e) { + var index = layer.open({ + type: 2, + title: '编辑', + area: ['100%', '100%'], //宽高 + fix: false, //不固定 + maxmin: true, + content: Feng.ctxPath + '/tDriverPromotionActivity/tDriverPromotionActivity_info/' + e + }); + this.layerIndex = index; +}; + +/** + * 删除 + */ +TDriverPromotionActivity.delete = function (e) { + var ajax = new $ax(Feng.ctxPath + "/tDriverPromotionActivity/delete", function (data) { + Feng.success("删除成功!"); + TDriverPromotionActivity.table.refresh(); + }, function (data) { + Feng.error("删除失败!" + data.responseJSON.message + "!"); + }); + ajax.set("tDriverPromotionActivityId", e); + ajax.start(); +}; +TDriverPromotionActivity.stop = function (e) { + var ajax = new $ax(Feng.ctxPath + "/tDriverPromotionActivity/stop", function (data) { + Feng.success("暂停成功!"); + TDriverPromotionActivity.table.refresh(); + }, function (data) { + Feng.error("暂停失败!" + data.responseJSON.message + "!"); + }); + ajax.set("id", e); + ajax.start(); +}; + +TDriverPromotionActivity.start = function (e) { + var ajax = new $ax(Feng.ctxPath + "/tDriverPromotionActivity/start", function (data) { + Feng.success("暂停成功!"); + TDriverPromotionActivity.table.refresh(); + }, function (data) { + Feng.error("暂停失败!" + data.responseJSON.message + "!"); + }); + ajax.set("id", e); + ajax.start(); +}; + + +TDriverPromotionActivity.startOrStop = function () { + if (this.check()) { + if (TDriverPromotionActivity.seItem.status == 1) { + TDriverPromotionActivity.stop(TDriverPromotionActivity.seItem.id); + } else { + TDriverPromotionActivity.start(TDriverPromotionActivity.seItem.id); + } + } +}; + +/** + * 查询列表 + */ +TDriverPromotionActivity.search = function () { + var queryData = {}; + queryData['name'] = $("#name").val(); + queryData['driverId'] = $("#driverId").val(); + TDriverPromotionActivity.table.refresh({query: queryData}); +}; +TDriverPromotionActivity.research = function () { + $("#name").val(''); + TDriverPromotionActivity.search() +}; +TDriverPromotionActivity.exportExcel = function () { + let p = ""; + let name = $('#name').val(); + let driverId = $('#driverId').val(); + if(null != name && '' != name){ + p += "name=" + name + "&"; + } + if(null != driverId && '' != driverId){ + p += "driverId=" + driverId + "&"; + } + if('' != p){ + p = "?" + p.substring(0, p.length - 1); + } + console.log('p['+p+']') + window.location.href = Feng.ctxPath + '/tDriverPromotionActivity/export1' + p; +}; + + +$(function () { + var defaultColunms = TDriverPromotionActivity.initColumn(); + var table = new BSTable(TDriverPromotionActivity.id, "/tDriverPromotionActivity/list2", defaultColunms); + table.setPaginationType("client"); + TDriverPromotionActivity.table = table.init(); + TDriverPromotionActivity.search() +}); diff --git a/ManagementQYTTravel/guns-admin/src/main/webapp/static/modular/system/tDriverPromotionActivity/tDriverPromotionActivity_info.js b/ManagementQYTTravel/guns-admin/src/main/webapp/static/modular/system/tDriverPromotionActivity/tDriverPromotionActivity_info.js new file mode 100644 index 0000000..4fded4e --- /dev/null +++ b/ManagementQYTTravel/guns-admin/src/main/webapp/static/modular/system/tDriverPromotionActivity/tDriverPromotionActivity_info.js @@ -0,0 +1,110 @@ +/** + * 初始化详情对话框 + */ +var TDriverPromotionActivityInfoDlg = { + tDriverPromotionActivityInfoData : {} +}; + +/** + * 清除数据 + */ +TDriverPromotionActivityInfoDlg.clearData = function() { + this.tDriverPromotionActivityInfoData = {}; +} + +/** + * 设置对话框中的数据 + * + * @param key 数据的名称 + * @param val 数据的具体值 + */ +TDriverPromotionActivityInfoDlg.set = function(key, val) { + this.tDriverPromotionActivityInfoData[key] = (typeof val == "undefined") ? $("#" + key).val() : val; + return this; +} + +/** + * 设置对话框中的数据 + * + * @param key 数据的名称 + * @param val 数据的具体值 + */ +TDriverPromotionActivityInfoDlg.get = function(key) { + return $("#" + key).val(); +} + +/** + * 关闭此对话框 + */ +TDriverPromotionActivityInfoDlg.close = function() { + parent.layer.close(window.parent.TDriverPromotionActivity.layerIndex); +} + +/** + * 收集数据 + */ +TDriverPromotionActivityInfoDlg.collectData = function() { + this + .set('id') + .set('bizType') + .set('activityTitle') + .set('province') + .set('provinceCode') + .set('city') + .set('cityCode') + .set('district') + .set('districtCode') + .set('startTime') + .set('endTime') + .set('commissionRatio') + .set('bindingDays') + .set('activityDesc') + .set('status') + .set('creator') + .set('createTime') + .set('updateTime'); +} + +/** + * 提交添加 + */ +TDriverPromotionActivityInfoDlg.addSubmit = function() { + + this.clearData(); + this.collectData(); + + //提交信息 + var ajax = new $ax(Feng.ctxPath + "/tDriverPromotionActivity/add", function(data){ + Feng.success("添加成功!"); + window.parent.TDriverPromotionActivity.table.refresh(); + TDriverPromotionActivityInfoDlg.close(); + },function(data){ + Feng.error("添加失败!" + data.responseJSON.message + "!"); + }); + ajax.set(this.tDriverPromotionActivityInfoData); + ajax.start(); +} + +/** + * 提交修改 + */ +TDriverPromotionActivityInfoDlg.editSubmit = function() { + + this.clearData(); + this.collectData(); + + //提交信息 + var ajax = new $ax(Feng.ctxPath + "/tDriverPromotionActivity/update", function(data){ + Feng.success("修改成功!"); + window.parent.TDriverPromotionActivity.table.refresh(); + TDriverPromotionActivityInfoDlg.close(); + },function(data){ + Feng.error("修改失败!" + data.responseJSON.message + "!"); + }); + ajax.set(this.tDriverPromotionActivityInfoData); + ajax.start(); +} + +$(function() { + +}); diff --git a/ManagementQYTTravel/guns-admin/src/main/webapp/static/modular/system/tPromotionOrderCar/tAbnormalOrderCar_info.js b/ManagementQYTTravel/guns-admin/src/main/webapp/static/modular/system/tPromotionOrderCar/tAbnormalOrderCar_info.js new file mode 100644 index 0000000..5fdbf49 --- /dev/null +++ b/ManagementQYTTravel/guns-admin/src/main/webapp/static/modular/system/tPromotionOrderCar/tAbnormalOrderCar_info.js @@ -0,0 +1,312 @@ +/** + * 初始化快车订单详情对话框 + */ +var TOrderPrivateCarInfoDlg = { + tOrderPrivateCarInfoData: {} +}; + +/** + * 清除数据 + */ +TOrderPrivateCarInfoDlg.clearData = function () { + this.tOrderPrivateCarInfoData = {}; +} + +/** + * 设置对话框中的数据 + * + * @param key 数据的名称 + * @param val 数据的具体值 + */ +TOrderPrivateCarInfoDlg.set = function (key, val) { + this.tOrderPrivateCarInfoData[key] = (typeof val == "undefined") ? $("#" + key).val() : val; + return this; +} + +/** + * 设置对话框中的数据 + * + * @param key 数据的名称 + * @param val 数据的具体值 + */ +TOrderPrivateCarInfoDlg.get = function (key) { + return $("#" + key).val(); +} + +/** + * 关闭此对话框 + */ +TOrderPrivateCarInfoDlg.close = function () { + parent.layer.close(window.parent.TOrderPrivateCar.layerIndex); +} + +/** + * 收集数据 + */ +TOrderPrivateCarInfoDlg.collectData = function () { + this + .set('id') + .set('type') + .set('userId') + .set('driverId') + .set('carId') + .set('orderNum') + .set('placementLon') + .set('placementLat') + .set('placementAddress') + .set('startLon') + .set('startLat') + .set('endLon') + .set('startAddress') + .set('endLat') + .set('endAddress') + .set('boardingLon') + .set('boardingLat') + .set('boardingAddress') + .set('boardingTime') + .set('getoffLon') + .set('getoffLat') + .set('getoffAddress') + .set('getoffTime') + .set('mileage') + .set('payManner') + .set('payType') + .set('orderMoney') + .set('startMoney') + .set('mileageMoney') + .set('durationMoney') + .set('longDistanceMoney') + .set('parkMoney') + .set('roadTollMoney') + .set('redPacketMoney') + .set('couponMoney') + .set('redPacketId') + .set('couponId') + .set('discount') + .set('discountMoney') + .set('activityId') + .set('companyId') + .set('payMoney') + .set('substitute') + .set('passengers') + .set('passengersPhone') + .set('state') + .set('insertTime') + .set('travelTime') + .set('snatchOrderTime') + .set('setOutTime') + .set('arriveTime') + .set('startServiceTime') + .set('endServiceTime') + .set('orderType') + .set('orderSource') + .set('invoiceId') + .set('isReassign') + .set('reassignNotice') + .set('trackId') + .set('isDelete') + .set('oldState') + .set('telX') + .set('bindId') + .set('serverCarModelId'); +} + +/** + * 提交添加 + */ +TOrderPrivateCarInfoDlg.addSubmit = function () { + + this.clearData(); + this.collectData(); + + if ($("#startAddress").val() === ""){ + Feng.error("请输入起点"); + return false; + } + if ($("#endAddress").val() === ""){ + Feng.error("请输入终点"); + return false; + } + if ($("#travelTime").val() === ""){ + Feng.error("请选择用车时间"); + return false; + } + if ($("#passengers").val() === ""){ + Feng.error("请输入乘车人姓名"); + return false; + } + if ($("#passengersPhone").val() === ""){ + Feng.error("请输入乘车人手机号"); + return false; + } + //提交信息 + var ajax = new $ax(Feng.ctxPath + "/tOrderPrivateCar/add", function (data) { + Feng.success("添加成功!"); + window.parent.TOrderPrivateCar.table.refresh(); + TOrderPrivateCarInfoDlg.close(); + }, function (data) { + Feng.error("添加失败!" + data.responseJSON.message + "!"); + }); + ajax.set(this.tOrderPrivateCarInfoData); + ajax.start(); +} +TOrderPrivateCarInfoDlg.save = function (){ + + const selectedBtn = document.querySelector('.duty-btn.active'); + const responsibilityTypeVal = reverseTypeMap[selectedBtn.dataset.type]; + const remark = document.querySelector('textarea[name=handleRemark]').value; + // 取money + const money = document.querySelector('input[name=money]').value; + const type = document.querySelector('input[name=type]').value; + const orderNum = document.querySelector('input[name=orderNum]').value; + + console.log(type,orderNum) + + //提交信息 + var ajax = new $ax(Feng.ctxPath + "/abnormal/save", function(data){ + Feng.success("操作成功!"); + },function(data){ + Feng.error("操作失败!"); + }); + ajax.set("responsibilityTypeVal",responsibilityTypeVal); + ajax.set("remark",remark); + ajax.set("money",money); + ajax.set("type",type); + ajax.set("orderNum",orderNum); + ajax.start(); + +} +/** + * 提交修改 + */ +TOrderPrivateCarInfoDlg.editSubmit = function () { + + this.clearData(); + this.collectData(); + + //提交信息 + var ajax = new $ax(Feng.ctxPath + "/tOrderPrivateCar/update", function (data) { + Feng.success("修改成功!"); + window.parent.TOrderPrivateCar.table.refresh(); + TOrderPrivateCarInfoDlg.close(); + }, function (data) { + Feng.error("修改失败!" + data.responseJSON.message + "!"); + }); + ajax.set(this.tOrderPrivateCarInfoData); + ajax.start(); +} + +var map = new AMap.Map("container", { + resizeEnable: true, + zoom: 14 +}); +$(function () { + var type = $("#type").val(); + if (type != 2) { + getTrajectory(); + } +}); + +function getTrajectory() { + $.ajax({ + url: Feng.ctxPath + '/tOrderPrivateCar/getOrderTrack', + type: 'POST', + data: { + orderDetailId: $("#id").val() + }, + success: function (res) { + if (res.status == 200) { + var data = res.data; + if (data.length > 0) { + orderTrack(data); + } + /*else{ + Feng.error("当前订单没有轨迹"); + }*/ + } else { + Feng.error(res.msg); + } + } + }); +} + +var marker, lineArr = []; + +function orderTrack(data) { + for (var i in data) { + var waypoints = []; + var lon = parseFloat(data[i].lon); + var lat = parseFloat(data[i].lat); + waypoints.push(lon); + waypoints.push(lat); + lineArr.push(waypoints); + } + + marker = new AMap.Marker({ + map: map, + position: lineArr[0], + icon: "https://webapi.amap.com/images/car.png", + offset: new AMap.Pixel(-26, -13), + autoRotation: true, + angle: -90, + }); + + // 绘制轨迹 + var polyline = new AMap.Polyline({ + map: map, + path: lineArr, + showDir: true, + strokeColor: "#28F", //线颜色 + // strokeOpacity: 1, //线透明度 + strokeWeight: 6, //线宽 + // strokeStyle: "solid" //线样式 + }); + + var passedPolyline = new AMap.Polyline({ + map: map, + // path: lineArr, + strokeColor: "#AF5", //线颜色 + // strokeOpacity: 1, //线透明度 + strokeWeight: 6, //线宽 + // strokeStyle: "solid" //线样式 + }); + + + marker.on('moving', function (e) { + passedPolyline.setPath(e.passedPath); + }); + + map.setFitView(); +} + + +function startAnimation() { + marker.moveAlong(lineArr, 200); +} + +function pauseAnimation() { + marker.pauseMove(); +} + +function resumeAnimation() { + marker.resumeMove(); +} + +function stopAnimation() { + marker.stopMove(); +} + +/** + * 选择起点 + */ +TOrderPrivateCarInfoDlg.startAddress = function () { + $("#startAddressModel").show(); +}; + + +/** + * 选择终点 + */ +TOrderPrivateCarInfoDlg.endAddress = function () { + $("#endAddressModel").show(); +}; diff --git a/ManagementQYTTravel/guns-admin/src/main/webapp/static/modular/system/tPromotionOrderCar/tPromotionOrder.js b/ManagementQYTTravel/guns-admin/src/main/webapp/static/modular/system/tPromotionOrderCar/tPromotionOrder.js new file mode 100644 index 0000000..8aaf06f --- /dev/null +++ b/ManagementQYTTravel/guns-admin/src/main/webapp/static/modular/system/tPromotionOrderCar/tPromotionOrder.js @@ -0,0 +1,219 @@ +/** + * 快车订单管理初始化 + */ +var TAbnormalOrder = { + id: "TOrderPrivateCarTable", //表格id + seItem: null, //选中的条目 + table: null, + layerIndex: -1 +}; + +/** + * 初始化表格的列 + */ +TAbnormalOrder.initColumn = function () { + return [ + {field: 'selectItem', radio: true}, + {title: '主键id', field: 'id', visible: false, align: 'center', valign: 'middle'}, + {title: '活动名称', field: 'name', visible: true, align: 'center', valign: 'middle',width:'8%', + }, + {title: '司机名称', field: 'driverName', visible: true, align: 'center', valign: 'middle', + }, + {title: '下级用户', field: 'userName', visible: true, align: 'center', valign: 'middle', + }, + {title: '订单编号', field: 'orderNum', visible: true, align: 'center', valign: 'middle', + }, + {title: '订单金额', field: 'money', visible: false, align: 'center', valign: 'middle'}, + {title: '司机推广收益', field: 'promotionMoney', visible: true, align: 'center', valign: 'middle', + }, + {title: '收益时间', field: 'successTime', visible: true, align: 'center', valign: 'middle', + } + ]; +}; + +/** + * 检查是否选中 + */ +TAbnormalOrder.check = function () { + var selected = $('#' + this.id).bootstrapTable('getSelections'); + if(selected.length == 0){ + Feng.info("请先选中表格中的某一记录!"); + return false; + }else{ + TAbnormalOrder.seItem = selected[0]; + return true; + } +}; + +/** + * 添加快车订单 + */ +TAbnormalOrder.addOrder =function(){ + var index = layer.open({ + type: 2, + title: '添加快车订单', + area: ['100%', '100%'], //宽高 + fix: false, //不固定 + maxmin: true, + content: Feng.ctxPath + '/tOrderPrivateCar/tOrderPrivateCar_addOrder' + }); + this.layerIndex = index; + +}; + +/** + * 打开查看快车订单详情 + */ +TAbnormalOrder.orderDetail = function () { + if (this.check()) { + var index = layer.open({ + type: 2, + title: '异常订单详情', + area: ['100%', '100%'], //宽高 + fix: false, //不固定 + maxmin: true, + content: Feng.ctxPath + '/abnormal/tOrderPrivateCar_orderDetail?tOrderPrivateCarId=' + TAbnormalOrder.seItem.id+'&type='+$("#type").val() + }); + this.layerIndex = index; + } +}; +TAbnormalOrder.orderDetail1 = function () { + if (this.check()) { + let abnormalStatus = TAbnormalOrder.seItem.abnormalStatus + if(abnormalStatus==2){ + Feng.info("此异常订单已处理") + return; + } + console.log(abnormalStatus) + var index = layer.open({ + type: 2, + title: '异常订单详情', + area: ['100%', '100%'], //宽高 + fix: false, //不固定 + maxmin: true, + content: Feng.ctxPath + '/abnormal/tOrderPrivateCar_orderDetail1?tOrderPrivateCarId=' + TAbnormalOrder.seItem.id+'&type='+$("#type").val() + }); + this.layerIndex = index; + } +}; + + +/** + * 订单轨迹 + */ +TAbnormalOrder.trajectory = function(){ + if (this.check()) { + var index = layer.open({ + type: 2, + title: '快车订单轨迹', + area: ['100%', '100%'], //宽高 + fix: false, //不固定 + maxmin: true, + content: Feng.ctxPath + '/tOrderPrivateCar/tOrderPrivateCar_trajectory/' + TAbnormalOrder.seItem.id + }); + this.layerIndex = index; + } +} + + +/** + * 删除快车订单 + */ +TAbnormalOrder.deleteOrder = function () { + if (this.check()) { + var orderNum = TAbnormalOrder.seItem.orderNum; + if (orderNum == "" || orderNum == null || orderNum == undefined) { + orderNum = "该订单"; + } else { + orderNum = "【" + orderNum + "】"; + } + if (TAbnormalOrder.seItem.state != 10) { + swal("删除失败", "【已取消】状态下才能执行此操作", "warning"); + return; + } + swal({ + title: "您是否确认删除" + orderNum + "?", + text: "请谨慎操作,删除后数据无法恢复!", + type: "warning", + showCancelButton: true, + confirmButtonColor: "#DD6B55", + confirmButtonText: "删除", + closeOnConfirm: false + }, function () { + var ajax = new $ax(Feng.ctxPath + "/tOrderPrivateCar/delete", function (data) { + swal("删除成功", "您已经删除了" + orderNum + "。", "success"); + TAbnormalOrder.table.refresh(); + }, function (data) { + swal("删除失败", data.responseJSON.message + "!", "warning"); + }); + ajax.set("tOrderPrivateCarId", TAbnormalOrder.seItem.id); + ajax.start(); + }); + } +}; + + + + + +/** + * 查询快车订单列表 + */ +TAbnormalOrder.search = function () { + var queryData = {}; + queryData['insertTime'] = $("#insertTime").val(); + queryData['name'] = $("#name").val(); + queryData['driverName'] = $("#driverName").val(); + queryData['userName'] = $("#userName").val(); + queryData['orderNum'] = $("#orderNum").val(); + TAbnormalOrder.table.refresh({query: queryData}); +}; + +TAbnormalOrder.exportExcel=function (){ + let p = ""; + let insertTime = $('#insertTime').val(); + let name = $('#name').val(); + let driverName = $('#driverName').val(); + let userName = $('#userName').val(); + let orderNum = $('#orderNum').val(); + if(null != insertTime && '' != insertTime){ + p += "insertTime=" + insertTime + "&"; + } + if(null != name && '' != name){ + p += "name=" + name + "&"; + } + if(null != driverName && '' != driverName){ + p += "driverName=" + driverName + "&"; + } + if(null != userName && '' != userName){ + p += "userName=" + userName + "&" ; + } + if(null != orderNum && '' != orderNum){ + p += "orderNum=" + orderNum + "&" ; + } + if('' != p){ + p = "?" + p.substring(0, p.length - 1); + } + console.log('p['+p+']') + window.location.href = Feng.ctxPath + '/promotionInfo/export' + p; +} + + + +TAbnormalOrder.resetSearch = function () { + $("#insertTime").val(""); + $("#name").val(""); + $("#driverName").val(""); + $("#userName").val(""); + $("#orderNum").val(""); + TAbnormalOrder.search(); +}; + + + +$(function () { + var defaultColunms = TAbnormalOrder.initColumn(); + var table = new BSTable(TAbnormalOrder.id, "/promotionInfo/list", defaultColunms); + table.setPaginationType("server"); + TAbnormalOrder.table = table.init(); +}); diff --git a/UserQYTTravel/guns-admin/pom.xml b/UserQYTTravel/guns-admin/pom.xml index 14973e1..3db4b12 100644 --- a/UserQYTTravel/guns-admin/pom.xml +++ b/UserQYTTravel/guns-admin/pom.xml @@ -232,6 +232,27 @@ <artifactId>quartz</artifactId> <version>2.2.1</version> </dependency> +<!-- 生成pdf--> + <dependency> + <groupId>com.itextpdf</groupId> + <artifactId>itextpdf</artifactId> + <version>5.5.13.3</version> + </dependency> + <dependency> + <groupId>com.itextpdf</groupId> + <artifactId>itext-asian</artifactId> + <version>5.2.0</version> + </dependency> +<!-- 邮件依赖--> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-mail</artifactId> + </dependency> + <dependency> + <groupId>commons-io</groupId> + <artifactId>commons-io</artifactId> + <version>2.11.0</version> + </dependency> </dependencies> diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/OrderController.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/OrderController.java index 34f5fbd..9707d2c 100644 --- a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/OrderController.java +++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/OrderController.java @@ -13,9 +13,13 @@ import com.stylefeng.guns.modular.smallLogistics.server.IOrderLogisticsService; import com.stylefeng.guns.modular.specialTrain.model.OrderPrivateCar; import com.stylefeng.guns.modular.specialTrain.server.IOrderPrivateCarService; +import com.stylefeng.guns.modular.system.dao.CarMapper; import com.stylefeng.guns.modular.system.dao.SystemPriceMapper; import com.stylefeng.guns.modular.system.model.*; +import com.stylefeng.guns.modular.system.model.vo.TripOrderVo; +import com.stylefeng.guns.modular.system.model.vo.TripSheetVo; import com.stylefeng.guns.modular.system.model.vo.UnPayOrderVO; +import com.stylefeng.guns.modular.system.pdf.TripSheetGenerator; import com.stylefeng.guns.modular.system.service.*; import com.stylefeng.guns.modular.system.util.*; import com.stylefeng.guns.modular.system.util.qianyuntong.OrderUtil; @@ -33,6 +37,9 @@ import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; + +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.data.redis.core.RedisTemplate; @@ -41,7 +48,10 @@ import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import java.io.File; import java.io.PrintWriter; +import java.io.Serializable; +import java.lang.reflect.InvocationTargetException; import java.text.SimpleDateFormat; import java.util.*; @@ -140,7 +150,20 @@ @Resource private ISystemPriceCityService systemPriceCityService; - + + @Value("${trip.sheet.filePath}") + private String filePath; + @Autowired + private EmailUtil emailUtil; + @Autowired + private TripSheetGenerator tripSheetGenerator; + @Autowired + private IServerCarModelService serverCarModelService; + + + + + /** * 获取正在进行中的订单 @@ -2203,5 +2226,287 @@ return ResultUtil.runErr(); } } + + @PostMapping("/api/order/queryMyTripList") + @ApiOperation(value = "获取我的行程列表", tags = {"用户端-个人中心"}, notes = "") + @ApiImplicitParams({ + @ApiImplicitParam(value = "订单类型(1=专车,2=出租车,3=跨城出行)", name = "type", required = true, dataType = "int"), + @ApiImplicitParam(value = "页码(首页1)", name = "pageNum", required = true, dataType = "int"), + @ApiImplicitParam(value = "页条数", name = "size", required = true, dataType = "int"), + @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....") + }) + public ResultUtil<List<TripOrderVo>> queryMyTripList(Integer type, Integer pageNum, Integer size, HttpServletRequest request){ + try { + Integer uid = userInfoService.getUserIdFormRedis(request); + if(null == uid){ + return ResultUtil.tokenErr(); + } + + List<Map<String,Object>> raw = fetchTrips(uid, type, pageNum, size); + return ResultUtil.success(TripOrderVo.getTripOrderVo(raw)); + + }catch (Exception e){ + e.printStackTrace(); + return ResultUtil.runErr(); + } + } + /** + * 私有:拉取指定 type 的行程列表。 + * type=0 → 全部类型;1/2/3 → 对应三种服务;pageNum/size 负责分页。 + * 对于 type==1 或 3,内部额外加载 serverCarModel 信息。 + */ + private List<Map<String,Object>> fetchTrips( + Integer uid, Integer type, Integer pageNum, Integer size) throws Exception { + + List<Map<String, Object>> list = new ArrayList<>(); + if (type == null || type == 0) { + list.addAll(orderPrivateCarService.queryMyTripListAll(uid)); + list.addAll(orderTaxiService.queryMyTripListAll(uid)); + list.addAll(orderCrossCityService.queryMyTripListAll(uid)); + } else { + switch (type) { + case 1: + list = orderPrivateCarService.queryMyTripList(uid, pageNum, size); + break; + case 2: + list = orderTaxiService.queryMyTripList(uid, pageNum, size); + break; + case 3: + list = orderCrossCityService.queryMyTripList(uid, pageNum, size); + break; + default: + throw new IllegalArgumentException("无效的订单类型:" + type); + } + } + // 排序 + list.sort((a, b) -> { + Date da = (Date) a.get("boardingTime"); + Date db = (Date) b.get("boardingTime"); + if (da == null && db == null) return 0; + if (da == null) return 1; // a 在后面 + if (db == null) return -1; // b 在后面 + return da.compareTo(db); // 按时间正序(升序)排列 + }); + // 将经纬度转换为城市并设置到数据中 + if (list != null && !list.isEmpty()) { + for (Map<String, Object> orderMap : list) { + // 获取经纬度(根据实际字段名调整) + Object lonObj = orderMap.get("boardingLon"); + Object latObj = orderMap.get("boardingLat"); + //获取公司id + Object companyId = orderMap.get("companyId"); + + Object serverCarModelId =null; + ServerCarModel serverCarModel = null; + if (orderMap.get("serverCarModelId") != null ){ + //获取车型id + serverCarModelId = orderMap.get("serverCarModelId"); + serverCarModel = serverCarModelService.selectById((Serializable) serverCarModelId); + } + + if (lonObj != null && latObj != null) { + String lon = lonObj.toString(); + String lat = latObj.toString(); + Company company = companyService.selectById((Serializable) companyId); + + try { + // 调用逆地理编码接口获取城市信息 + Map<String, String> geoInfo = gdMapGeocodingUtil.geocode(lon, lat); + // 将城市信息存入map,供后续转换VO使用 + orderMap.put("city", geoInfo.getOrDefault("city", "")); + orderMap.put("companyName", company.getName()); + if (serverCarModel != null) { + orderMap.put("serverCarModel", serverCarModel.getName()); + } + } catch (Exception e) { + // 记录转换失败日志,不中断流程 + System.err.println("经纬度转城市失败: " + lon + "," + lat + ",错误: " + e.getMessage()); + orderMap.put("city", ""); // 转换失败时设为空 + } + } else { + orderMap.put("city", ""); // 经纬度为空时设为空 + } + } + } + return list; + } + @PostMapping("/api/user/sendTripSheetEmail") + @ApiOperation(value = "发送行程单邮件", tags = {"用户端-个人中心"}, notes = "") + @ApiImplicitParams({ + @ApiImplicitParam(value = "行程单信息", name = "tripSheet", required = false, dataType = "com.stylefeng.guns.modular.system.model.vo.TripSheetVo"), + @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....") + }) + public ResultUtil sendTripSheetEmail(@RequestBody TripSheetVo tripSheet, + HttpServletRequest request) { + try { + // 从Redis中获取当前用户ID + Integer uid = userInfoService.getUserIdFormRedis(request); + if (null == uid) { + return ResultUtil.tokenErr(); + } + List<TripOrderVo> orderList = new ArrayList<>(); + if (tripSheet.isAllOrders()) { + // 这里复用 queryMyTripList 逻辑,不分页,type=0 表示全部 + List<Map<String, Object>> rawList = fetchTrips(uid, 0, null, null); + orderList = TripOrderVo.getTripOrderVo(rawList); + } else { + // 指定订单ID集合:验证并查询订单 + if (tripSheet.getOrderIdList() == null || tripSheet.getOrderIdList().isEmpty()) { + return ResultUtil.error("请传入订单ID集合或者选择全部订单"); + } + // 根据订单类型和ID查询订单 + orderList = queryOrdersByTypeAndIds(uid, tripSheet.getOrderType(), tripSheet.getOrderIdList()); + } + List<TripOrderVo> tripOrderVos = processTripOrderVos(orderList); + String filePath = tripSheetGenerator.generatePdf(tripOrderVos); + File attachment = new File(filePath); + emailUtil.sendEmailWithAttachment(tripSheet.getRecipientEmail(), "行程单", "请查收您的行程单", attachment); + attachment.delete(); // 发送成功后删除临时文件 + return ResultUtil.success("邮件发送成功"); + } catch (Exception e) { + e.printStackTrace(); + return ResultUtil.error("邮件发送失败"); + } + } + /** + * 根据订单类型和ID集合查询订单 + */ + private List<TripOrderVo> queryOrdersByTypeAndIds(Integer userId, Integer orderType, List<Integer> orderIds) throws InvocationTargetException, IllegalAccessException { + List<TripOrderVo> orderList = new ArrayList<>(); + List<Integer> states = Arrays.asList(8, 9); + // 根据订单类型查询对应表的订单 + switch (orderType) { + case 1: + EntityWrapper<OrderPrivateCar> wrapper = new EntityWrapper<>(); + wrapper.in("id", orderIds); + wrapper.in("state", states); + List<OrderPrivateCar> orderPrivateCars = orderPrivateCarService.selectList(wrapper); + for (OrderPrivateCar orderPrivateCar : orderPrivateCars) { + TripOrderVo vo = new TripOrderVo(); + BeanUtils.copyProperties(orderPrivateCar, vo); + orderList.add(vo); + } + break; + case 2: + EntityWrapper<OrderTaxi> wrapper2 = new EntityWrapper<>(); + wrapper2.in("id", orderIds); + wrapper2.in("state", states); + List<OrderTaxi> orderTaxis = orderTaxiService.selectList(wrapper2); + for (OrderTaxi orderTaxi : orderTaxis) { + TripOrderVo vo = new TripOrderVo(); + BeanUtils.copyProperties(orderTaxi, vo); + orderList.add(vo); + } + break; + case 3: + EntityWrapper<OrderCrossCity> wrapper3 = new EntityWrapper<>(); + wrapper3.in("id", orderIds); + wrapper3.in("state", states); + List<OrderCrossCity> orderCrossCities = orderCrossCityService.selectList(wrapper3); + for (OrderCrossCity orderCrossCity : orderCrossCities) { + TripOrderVo vo = new TripOrderVo(); + BeanUtils.copyProperties(orderCrossCity, vo); + orderList.add(vo); + } + break; + default: + throw new IllegalArgumentException("无效的订单类型:" + orderType); + } + orderList.sort((a, b) -> { + Date da = a.getBoardingTime(); + Date db = b.getBoardingTime(); + if (da == null && db == null) return 0; + if (da == null) return 1; // a 在后面 + if (db == null) return -1; // b 在后面 + return da.compareTo(db); // 按时间正序(升序)排列 + }); + + + return orderList; + } + + /** + * 处理行程订单VO列表,补充经纬度、公司和车型信息 + */ + private List<TripOrderVo> processTripOrderVos(List<TripOrderVo> orderVoList) { + if (orderVoList == null || orderVoList.isEmpty()) { + return new ArrayList<>(); + } + + for (TripOrderVo orderVo : orderVoList) { + // 处理经纬度转城市信息 + handleGeoInfoForVo(orderVo); + + // 处理公司信息 + handleCompanyInfoForVo(orderVo); + + // 处理车型信息 + handleCarModelInfoForVo(orderVo); + } + + return orderVoList; + } + + /** + * 处理经纬度转城市信息 + */ + private void handleGeoInfoForVo(TripOrderVo orderVo) { + // 直接从VO获取经纬度(假设VO中有对应的getter方法) + String lon = String.valueOf(orderVo.getBoardingLon()); + String lat = String.valueOf(orderVo.getBoardingLat()); + + if (StringUtils.isEmpty(lon) || StringUtils.isEmpty(lat)) { + orderVo.setCity(""); + return; + } + + try { + // 调用逆地理编码接口获取城市信息 + Map<String, String> geoInfo = gdMapGeocodingUtil.geocode(lon, lat); + orderVo.setCity(geoInfo.getOrDefault("city", "")); + } catch (Exception e) { + // 记录转换失败日志,不中断流程 + System.err.println("经纬度转城市失败: " + lon + "," + lat + ",错误: " + e.getMessage()); + orderVo.setCity(""); + } + } + + /** + * 处理公司信息 + */ + private void handleCompanyInfoForVo(TripOrderVo orderVo) { + // 从VO获取公司ID + Integer companyId = orderVo.getCompanyId(); + if (companyId == null) { + orderVo.setCompanyName(""); + return; + } + + Company company = companyService.selectById(companyId); + if (company != null) { + orderVo.setCompanyName(company.getName()); + } else { + orderVo.setCompanyName(""); + } + } + + /** + * 处理车型信息 + */ + private void handleCarModelInfoForVo(TripOrderVo orderVo) { + // 从VO获取车型ID + Integer serverCarModelId = orderVo.getServerCarModelId(); + if (serverCarModelId == null) { + orderVo.setServerCarModel(""); + return; + } + + ServerCarModel serverCarModel = serverCarModelService.selectById(serverCarModelId); + if (serverCarModel != null) { + orderVo.setServerCarModel(serverCarModel.getName()); + } else { + orderVo.setServerCarModel(""); + } + } } diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/UserInfoController.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/UserInfoController.java index 6cf4a8a..0a28538 100644 --- a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/UserInfoController.java +++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/UserInfoController.java @@ -361,6 +361,7 @@ Date endTime = DateUtils.addDays(new Date(), bindingDays); userInfo.setBindDriverId(driverId); userInfo.setBindExpireDate(endTime); + userInfo.setBindDate(new Date()); userInfoService.updateById(userInfo); } diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/dao/OrderCrossCityMapper.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/dao/OrderCrossCityMapper.java index 9dbc933..02d3c8c 100644 --- a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/dao/OrderCrossCityMapper.java +++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/dao/OrderCrossCityMapper.java @@ -91,4 +91,9 @@ * @return */ List<Map<String, Object>> queryRedEnvelope(@Param("uid") Integer uid); + + List<Map<String, Object>> queryMyTripList(@Param("uid") Integer uid, @Param("pageNum") Integer pageNum, + @Param("size") Integer size); + + List<Map<String, Object>> queryMyTripListAll(@Param("uid") Integer uid); } diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/dao/mapping/OrderCrossCityMapper.xml b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/dao/mapping/OrderCrossCityMapper.xml index 1c9da11..89bb029 100644 --- a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/dao/mapping/OrderCrossCityMapper.xml +++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/dao/mapping/OrderCrossCityMapper.xml @@ -350,12 +350,12 @@ CONCAT(j.startTime, '-', j.endTime) as lineShiftTime, a.holidayFee, a.discountAmount as taxiCardMoney, - a.responsibilityType, - a.abnormalStatus, - a.abnormalRemark, - a.abnormalIntro, - a.abnormalImg, - a.companyId + a.responsibilityType as responsibilityType, + a.abnormalStatus as abnormalStatus, + a.abnormalRemark as abnormalRemark, + a.abnormalIntro as abnormalIntro, + a.abnormalImg as abnormalImg, + a.companyId as companyId from t_order_cross_city a left join t_driver b on (a.driverId = b.id) left join t_car c on (a.carId = c.id) @@ -612,4 +612,51 @@ and DATE_FORMAT(a.travelTime, '%Y-%m-%d') = #{day} </if> </select> + + + <select id="queryMyTripList" resultType="map"> + select + id as orderId, + DATE_FORMAT(insertTime, '%Y-%m-%d %H:%i') as orderTime, + DATE_FORMAT(travelTime, '%m月?d日 %H:%i') as time, + startAddress as startAddress, + endAddress as endAddress, + driverId as driverId, + (3) as orderType, + state as state, + oldState as oldState, + thankYouFee, + passengersPhone, + payMoney, + endServiceTime, + companyId, + arriveTime, + boardingTime, + boardingLon, + boardingLat + from t_order_cross_city where userId = #{uid} and state in (8, 9) order by insertTime desc limit #{pageNum}, #{size} + </select> + + <select id="queryMyTripListAll" resultType="map"> + select + id as orderId, + DATE_FORMAT(insertTime, '%Y-%m-%d %H:%i') as orderTime, + DATE_FORMAT(travelTime, '%m月?d日 %H:%i') as time, + startAddress as startAddress, + endAddress as endAddress, + driverId as driverId, + (3) as orderType, + state as state, + oldState as oldState, + thankYouFee, + passengersPhone, + payMoney, + endServiceTime, + companyId, + arriveTime, + boardingTime, + boardingLon, + boardingLat + from t_order_cross_city where userId = #{uid} and state in (8, 9) order by insertTime desc + </select> </mapper> \ No newline at end of file diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/model/OrderCrossCity.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/model/OrderCrossCity.java index 7302a60..3fc8960 100644 --- a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/model/OrderCrossCity.java +++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/model/OrderCrossCity.java @@ -387,6 +387,16 @@ private Integer responsibilityType; + private Long promotionActivityId; + + public Long getPromotionActivityId() { + return promotionActivityId; + } + + public void setPromotionActivityId(Long promotionActivityId) { + this.promotionActivityId = promotionActivityId; + } + public Integer getResponsibilityType() { return responsibilityType; } diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/server/IOrderCrossCityService.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/server/IOrderCrossCityService.java index 2f6c4d5..d1f2130 100644 --- a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/server/IOrderCrossCityService.java +++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/server/IOrderCrossCityService.java @@ -329,5 +329,6 @@ void promotion(Integer orderId); - + List<Map<String, Object>> queryMyTripList(Integer uid, Integer pageNum, Integer size) throws Exception; + List<Map<String, Object>> queryMyTripListAll(Integer uid) throws Exception; } diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/server/impl/OrderCrossCityServiceImpl.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/server/impl/OrderCrossCityServiceImpl.java index 92675f9..9605ec5 100644 --- a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/server/impl/OrderCrossCityServiceImpl.java +++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/server/impl/OrderCrossCityServiceImpl.java @@ -2706,7 +2706,7 @@ } orderCrossCity.setAbnormalIntro(abnormalIntro); orderCrossCity.setAbnormalImg(abnormalImg); - orderCrossCity.setAbnormal(1); + orderCrossCity.setAbnormal(2); this.baseMapper.updateById(orderCrossCity); } @@ -2722,6 +2722,7 @@ BigDecimal bigDecimal = tDriverPromotionActivity.getCommissionRatio().divide(new BigDecimal(100), 2, RoundingMode.HALF_UP).multiply(new BigDecimal(payMoney)).setScale(2, RoundingMode.HALF_UP); orderCrossCity.setPromotionDriverId(userInfo.getBindDriverId()); orderCrossCity.setPromotionMoney(bigDecimal); + orderCrossCity.setPromotionActivityId(tDriverPromotionActivity.getId()); this.baseMapper.updateById(orderCrossCity); } } @@ -2736,4 +2737,28 @@ } } } + + @Override + public List<Map<String, Object>> queryMyTripList(Integer uid, Integer pageNum, Integer size) throws Exception { + pageNum = (pageNum - 1) * size; + List<Map<String, Object>> maps = orderCrossCityMapper.queryMyTripList(uid, pageNum, size); + for (Map<String, Object> map : maps) { + if (Integer.valueOf(String.valueOf(map.get("state"))) == 11) { + map.put("state", map.get("oldState")); + } + } + return maps; + } + + @Override + public List<Map<String, Object>> queryMyTripListAll(Integer uid) throws Exception { + + List<Map<String, Object>> maps = orderCrossCityMapper.queryMyTripListAll(uid); + for (Map<String, Object> map : maps) { + if (Integer.valueOf(String.valueOf(map.get("state"))) == 11) { + map.put("state", map.get("oldState")); + } + } + return maps; + } } diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/dao/OrderPrivateCarMapper.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/dao/OrderPrivateCarMapper.java index 28e3d56..f2a49a8 100644 --- a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/dao/OrderPrivateCarMapper.java +++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/dao/OrderPrivateCarMapper.java @@ -98,4 +98,9 @@ @Param("state") Integer state, @Param("lon") String lon, @Param("lat") String lat); + + List<Map<String, Object>> queryMyTripList(@Param("uid") Integer uid, @Param("pageNum") Integer pageNum, + @Param("size") Integer size); + + List<Map<String, Object>> queryMyTripListAll(@Param("uid") Integer uid); } diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/dao/mapping/OrderPrivateCarMapper.xml b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/dao/mapping/OrderPrivateCarMapper.xml index 6bd4523..7e722ca 100644 --- a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/dao/mapping/OrderPrivateCarMapper.xml +++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/dao/mapping/OrderPrivateCarMapper.xml @@ -581,4 +581,52 @@ </if> </select> + + + <select id="queryMyTripList" resultType="map"> + select + id as orderId, + rideType as rideType, + DATE_FORMAT(insertTime, '%Y-%m-%d %H:%i') as orderTime, + DATE_FORMAT(travelTime, '%m月?d日 %H:%i') as time, + startAddress as startAddress, + endAddress as endAddress, + driverId as driverId, + (1) as orderType, + state as state, + oldState as oldState, + thankYouFee, + passengersPhone, + payMoney, + endServiceTime, + companyId, + arriveTime, + boardingTime, + boardingLon, + boardingLat + from t_order_private_car where userId = #{uid} and state in (8, 9) order by insertTime desc limit #{pageNum}, #{size} + </select> + <select id="queryMyTripListAll" resultType="map"> + select + id as orderId, + rideType as rideType, + DATE_FORMAT(insertTime, '%Y-%m-%d %H:%i') as orderTime, + DATE_FORMAT(travelTime, '%m月?d日 %H:%i') as time, + startAddress as startAddress, + endAddress as endAddress, + driverId as driverId, + (1) as orderType, + state as state, + oldState as oldState, + thankYouFee, + passengersPhone, + payMoney, + endServiceTime, + companyId, + arriveTime, + boardingTime, + boardingLon, + boardingLat + from t_order_private_car where userId = #{uid} and state in (8, 9) order by insertTime desc + </select> </mapper> \ No newline at end of file diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/model/OrderPrivateCar.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/model/OrderPrivateCar.java index 53e9b55..aaa80e8 100644 --- a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/model/OrderPrivateCar.java +++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/model/OrderPrivateCar.java @@ -474,6 +474,8 @@ private String splitAllocation; private Integer responsibilityType; + + private Long promotionActivityId; /** * 中台行程id */ @@ -1271,81 +1273,5 @@ this.recoveryOrder = recoveryOrder; } - @Override - public String toString() { - return "OrderPrivateCar{" + - "id=" + id + - ", type=" + type + - ", crossCityOrderId=" + crossCityOrderId + - ", place=" + place + - ", userId=" + userId + - ", serverCarModelId=" + serverCarModelId + - ", driverId=" + driverId + - ", carId=" + carId + - ", orderNum='" + orderNum + '\'' + - ", placementLon=" + placementLon + - ", placementLat=" + placementLat + - ", placementAddress='" + placementAddress + '\'' + - ", startLon=" + startLon + - ", startLat=" + startLat + - ", startAddress='" + startAddress + '\'' + - ", endLon=" + endLon + - ", endLat=" + endLat + - ", endAddress='" + endAddress + '\'' + - ", boardingLon=" + boardingLon + - ", boardingLat=" + boardingLat + - ", boardingAddress='" + boardingAddress + '\'' + - ", boardingTime=" + boardingTime + - ", getoffLon=" + getoffLon + - ", getoffLat=" + getoffLat + - ", getoffAddress='" + getoffAddress + '\'' + - ", getoffTime=" + getoffTime + - ", mileage=" + mileage + - ", payManner=" + payManner + - ", payType=" + payType + - ", orderMoney=" + orderMoney + - ", startMileage=" + startMileage + - ", startMoney=" + startMoney + - ", mileageKilometers=" + mileageKilometers + - ", mileageMoney=" + mileageMoney + - ", duration=" + duration + - ", durationMoney=" + durationMoney + - ", wait=" + wait + - ", waitMoney=" + waitMoney + - ", longDistance=" + longDistance + - ", longDistanceMoney=" + longDistanceMoney + - ", parkMoney=" + parkMoney + - ", roadTollMoney=" + roadTollMoney + - ", redPacketMoney=" + redPacketMoney + - ", couponMoney=" + couponMoney + - ", redPacketId=" + redPacketId + - ", couponId=" + couponId + - ", discount=" + discount + - ", discountMoney=" + discountMoney + - ", activityId=" + activityId + - ", companyId=" + companyId + - ", payMoney=" + payMoney + - ", substitute=" + substitute + - ", passengers='" + passengers + '\'' + - ", passengersPhone='" + passengersPhone + '\'' + - ", state=" + state + - ", insertTime=" + insertTime + - ", travelTime=" + travelTime + - ", snatchOrderTime=" + snatchOrderTime + - ", setOutTime=" + setOutTime + - ", arriveTime=" + arriveTime + - ", startServiceTime=" + startServiceTime + - ", endServiceTime=" + endServiceTime + - ", orderType=" + orderType + - ", orderSource=" + orderSource + - ", invoiceId=" + invoiceId + - ", isReassign=" + isReassign + - ", reassignNotice=" + reassignNotice + - ", trackId='" + trackId + '\'' + - ", isDelete=" + isDelete + - ", oldState=" + oldState + - ", telX='" + telX + '\'' + - ", bindId='" + bindId + '\'' + - '}'; - } + } diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/server/IOrderPrivateCarService.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/server/IOrderPrivateCarService.java index a859fcd..0c9e66c 100644 --- a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/server/IOrderPrivateCarService.java +++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/server/IOrderPrivateCarService.java @@ -332,4 +332,8 @@ void promotion(Integer orderId); + List<Map<String, Object>> queryMyTripList(Integer uid, Integer pageNum, Integer size) throws Exception; + + List<Map<String, Object>> queryMyTripListAll(Integer uid) throws Exception; + } diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/server/impl/OrderPrivateCarServiceImpl.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/server/impl/OrderPrivateCarServiceImpl.java index 615c797..7236fab 100644 --- a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/server/impl/OrderPrivateCarServiceImpl.java +++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/server/impl/OrderPrivateCarServiceImpl.java @@ -752,7 +752,7 @@ UserInfo userInfo = userInfoService.selectById(userId); if(userInfo.getBindDriverId()!=null && userInfo.getBindExpireDate().getTime()<=System.currentTimeMillis()){ String registAreaCode = userInfo.getRegistAreaCode(); - TDriverPromotionActivity tDriverPromotionActivity = driverPromotionActivityService.selectOne(new EntityWrapper<TDriverPromotionActivity>().eq("districtCode", registAreaCode).ge("startTime", new Date()).lt("endTime", new Date()).last("AND FIND_IN_SET(" + 1 + ", bizType) limit 1")); + TDriverPromotionActivity tDriverPromotionActivity = driverPromotionActivityService.selectOne(new EntityWrapper<TDriverPromotionActivity>().eq("districtCode", registAreaCode).eq("state",1).ge("startTime", new Date()).lt("endTime", new Date()).last("AND FIND_IN_SET(" + 1 + ", bizType) limit 1")); if(tDriverPromotionActivity!=null){ return userInfo.getBindDriverId(); } @@ -2894,7 +2894,7 @@ } orderPrivateCar.setAbnormalIntro(abnormalIntro); orderPrivateCar.setAbnormalImg(abnormalImg); - orderPrivateCar.setAbnormal(1); + orderPrivateCar.setAbnormal(2); this.baseMapper.updateById(orderPrivateCar); } @@ -2913,6 +2913,7 @@ BigDecimal bigDecimal = tDriverPromotionActivity.getCommissionRatio().divide(new BigDecimal(100), 2, RoundingMode.HALF_UP).multiply(new BigDecimal(payMoney)).setScale(2, RoundingMode.HALF_UP); orderPrivateCar.setPromotionDriverId(userInfo.getBindDriverId()); orderPrivateCar.setPromotionMoney(bigDecimal); + orderPrivateCar.setPromotionActivityId(tDriverPromotionActivity.getId()); this.baseMapper.updateById(orderPrivateCar); } } @@ -2927,4 +2928,28 @@ } } } + + @Override + public List<Map<String, Object>> queryMyTripList(Integer uid, Integer pageNum, Integer size) throws Exception { + pageNum = (pageNum - 1) * size; + List<Map<String, Object>> maps = orderPrivateCarMapper.queryMyTripList(uid, pageNum, size); + for (Map<String, Object> map : maps) { + if (Integer.valueOf(String.valueOf(map.get("state"))) == 11) { + map.put("state", map.get("oldState")); + } + } + return maps; + } + + @Override + public List<Map<String, Object>> queryMyTripListAll(Integer uid) throws Exception { + + List<Map<String, Object>> maps = orderPrivateCarMapper.queryMyTripListAll(uid); + for (Map<String, Object> map : maps) { + if (Integer.valueOf(String.valueOf(map.get("state"))) == 11) { + map.put("state", map.get("oldState")); + } + } + return maps; + } } diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TDriverPromotionActivity.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TDriverPromotionActivity.java index a2e62ff..f3da3bf 100644 --- a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TDriverPromotionActivity.java +++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TDriverPromotionActivity.java @@ -96,6 +96,8 @@ private Date createTime; private Date updateTime; + private Integer state; + @Override protected Serializable pkVal() { diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/UserInfo.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/UserInfo.java index ba4d63d..a941215 100644 --- a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/UserInfo.java +++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/UserInfo.java @@ -151,6 +151,17 @@ @TableField("onconUUID") private String onconUUID; + + private Date bindDate; + + public Date getBindDate() { + return bindDate; + } + + public void setBindDate(Date bindDate) { + this.bindDate = bindDate; + } + public Integer getBindDriverId() { return bindDriverId; } diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/vo/TripOrderVo.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/vo/TripOrderVo.java new file mode 100644 index 0000000..b17c46b --- /dev/null +++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/vo/TripOrderVo.java @@ -0,0 +1,155 @@ +package com.stylefeng.guns.modular.system.model.vo; + +import com.stylefeng.guns.modular.system.warpper.OrderWarpper; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.*; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class TripOrderVo implements Comparable{ + + @ApiModelProperty("订单id") + private Integer orderId; + @ApiModelProperty("订单日期") + private String orderTime; + @ApiModelProperty("出行时间/(小件物流的取货时间)") + private String time; + @ApiModelProperty("起点名称") + private String startAddress; + @ApiModelProperty("终点名称") + private String endAddress; + @ApiModelProperty("公司id(服务商)") + private Integer companyId; + @ApiModelProperty("司机id") + private Integer driverId; + @ApiModelProperty("车辆id") + private Integer carId; + @ApiModelProperty("行程人电话") + private String passengersPhone; + @ApiModelProperty("订单状态(1=待接单,2=待出发,3=待到达预约地点,4=待乘客上车,5=服务中,6=完成服务,7=待支付,8=待评价,9=已完成,10=已取消,11=改派中,12=取消待支付)<br/>" + + "小件物流订单状态(1=待接单,2=待出发,3=待到达预约地点,4=待取货,5=送货中,6=已送达,7=待支付,8=需补差价,9=已取货,10=已取消,11=已支付差价") + private Integer state; + @ApiModelProperty("用车时长") + private Integer carTime; + @ApiModelProperty("车型id") + private Integer serverCarModelId; + @ApiModelProperty("车型") + private String serverCarModel; +// @ApiModelProperty("订单金额") +// private Double orderMoney; + @ApiModelProperty("支付金额") + private Double payMoney; +// @ApiModelProperty("差价金额") +// private Double differenceMoney; + @ApiModelProperty("感谢费") + private Double thankYouFee; +// @ApiModelProperty("开票状态(1=未开票,2=已开票)") +// private Integer invoice; + @ApiModelProperty("订单名称") + private String orderName; + @ApiModelProperty("订单类型(1=专车,2=出租车,3=跨城出行,4=小件物流,5=包车)") + private Integer orderType; + @ApiModelProperty("下单时间") + private Long insertTime; + @ApiModelProperty("服务结束事件") + private String endServiceTime; + @ApiModelProperty("乘车类型(1=独享,2=一口价,3=拼车)") + private Integer rideType; + @ApiModelProperty("上车经度") + private Double boardingLon; + @ApiModelProperty("上车纬度") + private Double boardingLat; + @ApiModelProperty("上车时间") + private Date boardingTime; // 从LocalDateTime改为Date + + @ApiModelProperty("到达时间") + private Date arriveTime; // 从LocalDateTime改为Date + @ApiModelProperty("城市") + private String city; + @ApiModelProperty("服务商") + private String companyName; + + public static List<TripOrderVo> getTripOrderVo(List<Map<String, Object>> maps) { + List<TripOrderVo> list = new ArrayList<>(); + if (null != maps) { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.S"); + for (Map<String, Object> map : maps) { + TripOrderVo tripOrderVo = new TripOrderVo(); + + tripOrderVo.setRideType(null != map.get("rideType") ? Integer.valueOf(String.valueOf(map.get("rideType"))) : 1); + tripOrderVo.setOrderId(null != map.get("orderId") ? Integer.valueOf(String.valueOf(map.get("orderId"))) : 0); + tripOrderVo.setOrderTime(null != map.get("orderTime") ? String.valueOf(map.get("orderTime")) : ""); + tripOrderVo.setTime(null != map.get("time") ? String.valueOf(map.get("time")) : ""); + tripOrderVo.setStartAddress(null != map.get("startAddress") ? String.valueOf(map.get("startAddress")) : ""); + tripOrderVo.setEndAddress(null != map.get("endAddress") ? String.valueOf(map.get("endAddress")) : ""); + tripOrderVo.setState(null != map.get("state") ? Integer.valueOf(String.valueOf(map.get("state"))) : 0); +// tripOrderVo.setOrderMoney(null != map.get("orderMoney") ? Double.valueOf(String.valueOf(map.get("orderMoney"))) : 0); + tripOrderVo.setPayMoney(null != map.get("payMoney") ? Double.valueOf(String.valueOf(map.get("payMoney"))) : 0); +// tripOrderVo.setInvoice(null != map.get("invoice") ? Integer.valueOf(String.valueOf(map.get("invoice"))) : 0); + tripOrderVo.setOrderName(null != map.get("orderName") ? String.valueOf(map.get("orderName")) : ""); + tripOrderVo.setInsertTime(null != map.get("insertTime") ? Long.valueOf(String.valueOf(map.get("insertTime"))) : 0); + tripOrderVo.setOrderType(null != map.get("orderType") ? Integer.valueOf(String.valueOf(map.get("orderType"))) : 0); + tripOrderVo.setDriverId(null != map.get("driverId") ? Integer.valueOf(String.valueOf(map.get("driverId"))) : 0); + tripOrderVo.setCarTime(null != map.get("carTime") ? Integer.valueOf(String.valueOf(map.get("carTime"))) : 0); + tripOrderVo.setServerCarModel(null != map.get("serverCarModel") ? String.valueOf(map.get("serverCarModel")) : ""); +// tripOrderVo.setDifferenceMoney(null != map.get("differenceMoney") ? Double.valueOf(map.get("differenceMoney").toString()) : 0D); + tripOrderVo.setThankYouFee(null != map.get("thankYouFee") ? Double.valueOf(map.get("thankYouFee").toString()) : 0D); + tripOrderVo.setEndServiceTime(null != map.get("endServiceTime") ? String.valueOf(map.get("endServiceTime")) : ""); + tripOrderVo.setCompanyId(null != map.get("companyId") ? Integer.valueOf(String.valueOf(map.get("companyId"))) : 0); + tripOrderVo.setPassengersPhone(null != map.get("passengersPhone") ? String.valueOf(map.get("passengersPhone")) : ""); + tripOrderVo.setBoardingLon(null != map.get("boardingLon") ? Double.valueOf(String.valueOf(map.get("boardingLon"))) : 0D); + tripOrderVo.setBoardingLat(null != map.get("boardingLat") ? Double.valueOf(String.valueOf(map.get("boardingLat"))) : 0D); + tripOrderVo.setCity(null != map.get("city") ? String.valueOf(map.get("city")) : ""); + try { + tripOrderVo.setBoardingTime(null != map.get("boardingTime") ? + sdf.parse(String.valueOf(map.get("boardingTime"))) : null); + } catch (ParseException e) { + // 处理解析异常 + tripOrderVo.setBoardingTime(null); + } + try { + tripOrderVo.setArriveTime(null != map.get("arriveTime") ? + sdf.parse(String.valueOf(map.get("arriveTime"))) : null); + } catch (ParseException e) { + // 处理解析异常 + tripOrderVo.setArriveTime(null); + } + tripOrderVo.setCompanyName(null != map.get("companyName") ? String.valueOf(map.get("companyName")) : ""); + tripOrderVo.setCarId(null != map.get("carId") ? Integer.valueOf(String.valueOf(map.get("carId"))) : 0); + tripOrderVo.setServerCarModelId(null != map.get("serverCarModelId") ? Integer.valueOf(String.valueOf(map.get("serverCarModelId"))) : 0); + list.add(tripOrderVo); + } + + } + Collections.sort(list); + return list; + } + + @Override + public int compareTo(Object o) { + if (o instanceof OrderWarpper) { + OrderWarpper s = (OrderWarpper) o; + if(this.insertTime == null || s.getInsertTime() == null){ + return -1; + } + if (this.insertTime > s.getInsertTime()) { + return -1; + } else if (this.insertTime == s.getInsertTime()) { + return 0; + } else { + return 1; + } + } + return 0; + } +} diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/vo/TripSheetVo.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/vo/TripSheetVo.java new file mode 100644 index 0000000..30083dc --- /dev/null +++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/vo/TripSheetVo.java @@ -0,0 +1,33 @@ +package com.stylefeng.guns.modular.system.model.vo; + + +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.Getter; +import lombok.NoArgsConstructor; +import org.springframework.web.bind.annotation.RequestParam; + +import java.util.List; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Getter +public class TripSheetVo { + @ApiModelProperty(value = "是否获取全部行程订单") + private boolean allOrders; + + @ApiModelProperty(value = "行程订单Id") + private List<Integer> orderIdList; + + @ApiModelProperty(value = "订单类型,1-专车,2-出租车,3-跨城") + private Integer orderType; + + @ApiModelProperty(value = "收件人邮箱") + private String recipientEmail; + + + + +} diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/pdf/TripSheetGenerator.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/pdf/TripSheetGenerator.java new file mode 100644 index 0000000..23c7f29 --- /dev/null +++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/pdf/TripSheetGenerator.java @@ -0,0 +1,337 @@ +package com.stylefeng.guns.modular.system.pdf; + +import com.itextpdf.text.*; +import com.itextpdf.text.pdf.BaseFont; +import com.itextpdf.text.pdf.PdfPCell; +import com.itextpdf.text.pdf.PdfPTable; +import com.itextpdf.text.pdf.PdfWriter; +import com.stylefeng.guns.modular.system.model.vo.TripOrderVo; +import com.stylefeng.guns.modular.system.warpper.OrderWarpper; +import org.apache.commons.io.FileUtils; +import org.apache.commons.io.IOUtils; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.core.io.ClassPathResource; +import org.springframework.core.io.Resource; +import org.springframework.stereotype.Component; +import org.springframework.web.context.ServletContextAware; + +import java.io.*; +import java.net.URL; +import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.List; +import java.util.UUID; + +@Component +public class TripSheetGenerator { + + @Value("${trip.sheet.filePath}") + private String pdfDir; + + // 内置中文备用字体 + private static final String FALLBACK_FONT = "STSong-Light"; + private static final String FALLBACK_ENCODING = "UniGB-UCS2-H"; + + // 完整日期时间格式 + private static final DateTimeFormatter DATE_TIME_FORMATTER = + DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + + public String generatePdf(List<TripOrderVo> orders) throws DocumentException, IOException { + if (orders == null || orders.isEmpty()) { + throw new IllegalArgumentException("订单列表不能为空"); + } + + String fileName = "行程单_" + UUID.randomUUID() + ".pdf"; + String filePath = pdfDir + fileName; + File file = new File(filePath); + FileUtils.forceMkdirParent(file); + + Document document = new Document(PageSize.A4); + PdfWriter.getInstance(document, new FileOutputStream(file)); + document.open(); + + // 新布局:Logo+标题 → 主标题 → 信息行 → 表格 + addLogoAndTitle(document); + addMainTitle(document); + addTripInfo(document, orders); + addOrderTable(document, orders); + + document.close(); + return filePath; + } + + private void addLogoAndTitle(Document document) throws DocumentException { + try { + document.setMargins(10, 50, 50, 50); // 左=0,右=50,上=50,下=50(单位:pt) + Resource logoResource = new ClassPathResource("static/img/logo.png"); + if (logoResource.exists()) { + Image logo = Image.getInstance(logoResource.getURL()); + logo.scaleToFit(80, 40); // 保持logo原有尺寸(宽100pt,高40pt) + + // 1. 调整表格列宽:左列刚好容纳logo,右列仅够放下文字(缩小间距) + // 列宽比例:左列100pt(logo宽度),右列80pt(文字宽度,足够放下“贵人家园”) + PdfPTable layoutTable = new PdfPTable(new float[]{81f, 100f}); // 左列(Logo),右列100f(文字) + layoutTable.setWidthPercentage(35); + layoutTable.setSpacingAfter(15f); // 与下方主标题的间距不变 + layoutTable.setHorizontalAlignment(Element.ALIGN_LEFT); // 整体左对齐,避免居中导致的空隙 + + // 2. 左单元格(logo):消除内边距,紧贴右侧 + PdfPCell logoCell = new PdfPCell(logo); + logoCell.setBorder(Rectangle.NO_BORDER); // 无边框 + logoCell.setPadding(0); // 去除内边距(关键:默认padding会导致空隙) + logoCell.setVerticalAlignment(Element.ALIGN_MIDDLE); // 垂直居中对齐 + logoCell.setHorizontalAlignment(Element.ALIGN_RIGHT); //logo居中 + layoutTable.addCell(logoCell); + + // 3. 右单元格(文字):消除内边距,紧贴左侧 + Font titleFont = getChineseFont(18, Font.BOLD); + Paragraph titlePara = new Paragraph("贵人家园", titleFont); + titlePara.setAlignment(Element.ALIGN_LEFT); // 文字左对齐,贴近logo + titlePara.setSpacingBefore(0); + titlePara.setSpacingAfter(0); + + PdfPCell titleCell = new PdfPCell(titlePara); + titleCell.setBorder(Rectangle.NO_BORDER); // 无边框 + titleCell.setPadding(0); // 去除内边距(关键) + titleCell.setVerticalAlignment(Element.ALIGN_MIDDLE); // 垂直居中对齐 + titleCell.setHorizontalAlignment(Element.ALIGN_LEFT); // 文字靠左,贴近logo + layoutTable.addCell(titleCell); + + document.add(layoutTable); + // 关键3:恢复页面默认边距(避免影响后续内容) + document.setMargins(50, 50, 50, 50); + } else { + // 降级处理(无logo时) + Font titleFont = getChineseFont(18, Font.BOLD); + Paragraph fallbackTitle = new Paragraph("贵人家园", titleFont); + fallbackTitle.setAlignment(Element.ALIGN_LEFT); + fallbackTitle.setSpacingAfter(15f); + document.add(fallbackTitle); + } + } catch (Exception e) { + System.err.println("Logo加载失败: " + e.getMessage()); + // 降级处理 + Font titleFont = getChineseFont(18, Font.BOLD); + Paragraph fallbackTitle = new Paragraph("贵人家园", titleFont); + fallbackTitle.setAlignment(Element.ALIGN_LEFT); + fallbackTitle.setSpacingAfter(15f); + document.add(fallbackTitle); + } + } + + // 新增主标题方法(原 addTitle 逻辑调整) + private void addMainTitle(Document document) throws DocumentException { + Font titleFont = getChineseFont(18, Font.BOLD); + Paragraph mainTitle = new Paragraph("贵人家园—打车—行程单", titleFont); + mainTitle.setAlignment(Element.ALIGN_CENTER); + mainTitle.setSpacingBefore(5f); + mainTitle.setSpacingAfter(15f); + document.add(mainTitle); + } + + + + // 修改信息行构建逻辑(以第一行为例) + private void addTripInfo(Document document, List<TripOrderVo> orders) throws DocumentException { + if (orders.isEmpty()) return; + TripOrderVo first = orders.get(0); + TripOrderVo last = orders.size() > 1 ? orders.get(orders.size() - 1) : first; + + Font infoFont = getChineseFont(10, Font.NORMAL); + // 申请时间现在的时间 + String applyTime = DATE_TIME_FORMATTER.format(LocalDateTime.now()); +// 首先定义SimpleDateFormat(可以是类的静态成员) + SimpleDateFormat DATE_FORMATTER = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + + String tripTimeStart = first.getBoardingTime() != null + ? DATE_FORMATTER.format(first.getBoardingTime()) : "N/A"; + String tripTimeEnd = last.getBoardingTime() != null + ? DATE_FORMATTER.format(last.getBoardingTime()) : "N/A"; + + String tripTime = tripTimeStart + " 至 " + tripTimeEnd; + + // 总金额计算(修复:先定义 totalText 并拼接内容) + double totalAmount = orders.stream() + .mapToDouble(o -> o.getPayMoney() != null ? o.getPayMoney() : 0) + .sum(); + String totalPrefix = "共计" + orders.size() + "单行程,合计"; + String totalMoney = String.format("%.2f元", totalAmount); + String totalText = totalPrefix + totalMoney; // 正确定义 totalText + + + // ========== 第一行:申请时间 + 行程时间(均带分隔条) ========== + // 关键:通过表格列宽控制分隔条宽度(8pt) + PdfPTable line1Table = new PdfPTable(4); + line1Table.setWidthPercentage(100); + line1Table.setSpacingAfter(5f); + // 列宽比例:分隔条列固定为8pt,内容列按比例分配 + line1Table.setWidths(new float[]{4, 200, 4, 374}); + + // 列1:申请时间前的蓝色分隔条(宽度由表格列宽控制) + line1Table.addCell(createBlueSeparatorCell()); + + // 列2:申请时间内容 + Paragraph applyPara = new Paragraph(); + applyPara.add(new Chunk("申请时间:", infoFont)); + applyPara.add(new Chunk(applyTime, infoFont)); + line1Table.addCell(createContentCell(applyPara)); + + // 列3:行程时间前的蓝色分隔条(与列1宽度一致) + line1Table.addCell(createBlueSeparatorCell()); + + // 列4:行程时间内容 + Paragraph tripPara = new Paragraph(); + tripPara.add(new Chunk("行程时间:", infoFont)); + tripPara.add(new Chunk(tripTime, infoFont)); + line1Table.addCell(createContentCell(tripPara)); + + document.add(line1Table); + + + // ========== 第二行:手机号 + 共计订单(均带分隔条) ========== + PdfPTable line2Table = new PdfPTable(4); + line2Table.setWidthPercentage(100); + line2Table.setSpacingAfter(15f); + // 与第一行保持完全相同的列宽比例(确保分隔条对齐) + line2Table.setWidths(new float[]{4, 200, 4, 374}); + + // 列1:手机号前的蓝色分隔条 + line2Table.addCell(createBlueSeparatorCell()); + + // 列2:手机号内容 + Paragraph phonePara = new Paragraph(); + phonePara.add(new Chunk("行程人手机号:", infoFont)); + phonePara.add(new Chunk(first.getPassengersPhone() != null ? first.getPassengersPhone() : "N/A", infoFont)); + line2Table.addCell(createContentCell(phonePara)); + + // 列3:共计订单前的蓝色分隔条 + line2Table.addCell(createBlueSeparatorCell()); + + // 列4:共计订单内容 + Paragraph totalPara = new Paragraph(); + totalPara.add(new Chunk(totalPrefix, infoFont)); + Font totalFont = getChineseFont(10, Font.BOLD); + totalFont.setColor(BaseColor.RED); + totalPara.add(new Chunk(totalMoney, totalFont)); + line2Table.addCell(createContentCell(totalPara)); + + document.add(line2Table); + } + + /** + * 蓝色分隔条单元格(宽度由所在表格的列宽控制,无需单独设置) + */ + private PdfPCell createBlueSeparatorCell() { + PdfPCell separatorCell = new PdfPCell(); + // 关键:不设置宽度,完全由表格的 setWidths() 控制 + separatorCell.setBackgroundColor(BaseColor.BLUE); // 蓝色背景 + separatorCell.setBorder(Rectangle.NO_BORDER); // 无边框 + separatorCell.setMinimumHeight(8); // 匹配文字行高 + separatorCell.setPadding(0); // 去除内边距,确保分隔条紧凑 + return separatorCell; + } + + /** + * 内容单元格样式 + */ + private PdfPCell createContentCell(Paragraph content) { + PdfPCell cell = new PdfPCell(content); + cell.setBorder(Rectangle.NO_BORDER); + cell.setPaddingLeft(5); // 内容与分隔条的间距 + cell.setHorizontalAlignment(Element.ALIGN_LEFT); + return cell; + } + private void addOrderTable(Document document, List<TripOrderVo> orders) throws DocumentException { + // 调整列宽:第1列(序号)加宽至1.5f + float[] columnWidths = {1.5f, 2f, 2f, 3f, 2f, 3f, 3f, 2f}; + PdfPTable table = new PdfPTable(columnWidths); + table.setWidthPercentage(100); + table.setSpacingBefore(10f); // 与上方信息行的间距 + + // 表头样式(蓝色背景,白色文字,居中) + Font headerFont = getChineseFont(10, Font.BOLD); + headerFont.setColor(BaseColor.WHITE); + BaseColor headerBg = new BaseColor(59, 130, 246); + String[] headers = {"序号","服务商","车型","上车时间","城市","起点","终点","金额"}; + + for (String header : headers) { + PdfPCell cell = new PdfPCell(new Paragraph(header, headerFont)); + cell.setBackgroundColor(headerBg); + cell.setPadding(5); + cell.setHorizontalAlignment(Element.ALIGN_CENTER); + table.addCell(cell); + } + SimpleDateFormat DATE_FORMATTER = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); // 格式可根据需求调整 + // 单元格样式(居中对齐,统一处理) + Font cellFont = getChineseFont(9, Font.NORMAL); + for (int i = 0; i < orders.size(); i++) { + TripOrderVo order = orders.get(i); + // 序号列:强制居中,内容为 i+1 + addCenteredCell(table, String.valueOf(i + 1), cellFont); + addCenteredCell(table, order.getCompanyName(), cellFont); + addCenteredCell(table, order.getServerCarModel(), cellFont); + addCenteredCell(table, + order.getBoardingTime() != null + ? DATE_FORMATTER.format(order.getBoardingTime()) // Date类型用SimpleDateFormat的format方法 + : "N/A", + cellFont); + addCenteredCell(table, order.getCity(), cellFont); + addCenteredCell(table, order.getStartAddress(), cellFont); + addCenteredCell(table, order.getEndAddress(), cellFont); + + // 金额列:右对齐 + PdfPCell moneyCell = new PdfPCell( + new Paragraph(String.format("%.2f元", + order.getPayMoney() != null ? order.getPayMoney() : 0), + cellFont) + ); + moneyCell.setHorizontalAlignment(Element.ALIGN_RIGHT); + moneyCell.setPadding(5); + table.addCell(moneyCell); + } + + document.add(table); + } + + // 辅助方法:创建居中对齐的单元格 + private void addCenteredCell(PdfPTable table, String text, Font font) { + PdfPCell cell = new PdfPCell(new Paragraph(text != null ? text : "", font)); + cell.setPadding(5); + cell.setHorizontalAlignment(Element.ALIGN_CENTER); + table.addCell(cell); + } + + private void addTableCell(PdfPTable table, String text, Font font) { + PdfPCell cell = new PdfPCell(new Paragraph(text != null ? text : "", font)); + cell.setPadding(5); + table.addCell(cell); + } + + /** + * 获取中文字体,优先自定义字体,fallback到 CJK 内置 + */ + private Font getChineseFont(float size, int style) { + // 自定义字体 + try { + Resource res = new ClassPathResource("static/fonts/AlibabaPuHuiTi-3-105-Heavy.ttf"); + if (res.exists()) { + BaseFont bf = BaseFont.createFont( + res.getURL().toString(), BaseFont.IDENTITY_H, BaseFont.EMBEDDED); + return new Font(bf, size, style); + } + } catch (Exception e) { + System.err.println("加载自定义字体失败: " + e.getMessage()); + } + // 内置 CJK 字体 + try { + BaseFont bf = BaseFont.createFont( + FALLBACK_FONT, FALLBACK_ENCODING, BaseFont.EMBEDDED); + return new Font(bf, size, style); + } catch (Exception e) { + System.err.println("加载备用字体失败: " + e.getMessage()); + return new Font(Font.FontFamily.HELVETICA, size, style); + } + } +} diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/EmailUtil.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/EmailUtil.java new file mode 100644 index 0000000..e09f2dd --- /dev/null +++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/EmailUtil.java @@ -0,0 +1,52 @@ +package com.stylefeng.guns.modular.system.util; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.mail.SimpleMailMessage; +import org.springframework.mail.javamail.JavaMailSender; +import org.springframework.mail.javamail.MimeMessageHelper; +import org.springframework.stereotype.Component; +import org.springframework.stereotype.Service; +import javax.mail.MessagingException; +import javax.mail.internet.MimeMessage; +import java.io.File; + +@Component +public class EmailUtil { + private final JavaMailSender javaMailSender; + + // 从配置文件读取发件人邮箱(必须与spring.mail.username一致) + @Value("${spring.mail.username}") + private String fromEmail; + + @Autowired + public EmailUtil(JavaMailSender javaMailSender) { + this.javaMailSender = javaMailSender; + } + + public void sendEmailWithAttachment(String to, String subject, String text, File attachment) throws MessagingException { + MimeMessage message = javaMailSender.createMimeMessage(); + MimeMessageHelper helper = new MimeMessageHelper(message, true); + + // 设置发件人(必须与配置的spring.mail.username一致) + helper.setFrom(fromEmail); + // 设置收件人 + helper.setTo(to); + // 设置邮件主题和内容 + helper.setSubject(subject); + helper.setText(text); + // 添加附件 + helper.addAttachment(attachment.getName(), attachment); + + // 发送邮件 + javaMailSender.send(message); + } + + public void sendSimpleEmail(String to, String subject, String text) { + SimpleMailMessage message = new SimpleMailMessage(); + message.setTo(to); + message.setSubject(subject); + message.setText(text); + javaMailSender.send(message); + } +} \ No newline at end of file diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/dao/OrderTaxiMapper.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/dao/OrderTaxiMapper.java index 6f8920e..dce3cc5 100644 --- a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/dao/OrderTaxiMapper.java +++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/dao/OrderTaxiMapper.java @@ -89,4 +89,16 @@ */ List<OrderTaxi> queryByState_(@Param("uid") Integer uid, @Param("orderType") Integer orderType, @Param("type") Integer type, @Param("state") Integer...state); + + /** + * 获取用户的行程列表 + * @param uid + * @param pageNum + * @param size + * @return + */ + List<Map<String, Object>> queryMyTripList(@Param("uid") Integer uid, @Param("pageNum") Integer pageNum, + @Param("size") Integer size); + + List<Map<String, Object>> queryMyTripListAll(@Param("uid") Integer uid); } diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/dao/mapping/OrderTaxiMapper.xml b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/dao/mapping/OrderTaxiMapper.xml index da859a5..53b5f99 100644 --- a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/dao/mapping/OrderTaxiMapper.xml +++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/dao/mapping/OrderTaxiMapper.xml @@ -414,4 +414,50 @@ and `type` = #{type} </if> </select> + + <select id="queryMyTripList" resultType="map"> + select + id as orderId, + DATE_FORMAT(insertTime, '%Y-%m-%d %H:%i') as orderTime, + DATE_FORMAT(travelTime, '%m月%d日 %H:%i') as time, + startAddress as startAddress, + endAddress as endAddress, + driverId as driverId, + (2) as orderType, + state as state, + oldState as oldState, + thankYouFee, + passengersPhone, + payMoney, + endServiceTime, + companyId, + arriveTime, + boardingTime, + boardingLon, + boardingLat + from t_order_taxi where userId = #{uid} and state in (8, 9) order by insertTime desc limit #{pageNum}, #{size} + </select> + + <select id="queryMyTripListAll" resultType="map"> + select + id as orderId, + DATE_FORMAT(insertTime, '%Y-%m-%d %H:%i') as orderTime, + DATE_FORMAT(travelTime, '%m月%d日 %H:%i') as time, + startAddress as startAddress, + endAddress as endAddress, + driverId as driverId, + (2) as orderType, + state as state, + oldState as oldState, + thankYouFee, + passengersPhone, + payMoney, + endServiceTime, + companyId, + arriveTime, + boardingTime, + boardingLon, + boardingLat + from t_order_taxi where userId = #{uid} and state in (8, 9) order by insertTime desc + </select> </mapper> \ No newline at end of file diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/model/OrderTaxi.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/model/OrderTaxi.java index 2e10d90..a63b98b 100644 --- a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/model/OrderTaxi.java +++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/model/OrderTaxi.java @@ -403,6 +403,17 @@ */ private Integer isCreated; + private Long promotionActivityId; + + public Long getPromotionActivityId() { + return promotionActivityId; + } + + public void setPromotionActivityId(Long promotionActivityId) { + this.promotionActivityId = promotionActivityId; + } + + public Integer getResponsibilityType() { return responsibilityType; } diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/service/IOrderTaxiService.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/service/IOrderTaxiService.java index 99f5386..a3812e1 100644 --- a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/service/IOrderTaxiService.java +++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/service/IOrderTaxiService.java @@ -313,4 +313,16 @@ void promotion(Integer orderId); + /** + * 获取我的行程列表 + * @param uid + * @param pageNum + * @param size + * @return + * @throws Exception + */ + List<Map<String, Object>> queryMyTripList(Integer uid, Integer pageNum, Integer size) throws Exception; + + List<Map<String, Object>> queryMyTripListAll(Integer uid) throws Exception; + } diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/service/impl/OrderTaxiServiceImpl.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/service/impl/OrderTaxiServiceImpl.java index 2cfd3a2..800a5a2 100644 --- a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/service/impl/OrderTaxiServiceImpl.java +++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/service/impl/OrderTaxiServiceImpl.java @@ -2462,7 +2462,7 @@ } orderTaxi.setAbnormalIntro(abnormalIntro); orderTaxi.setAbnormalImg(abnormalImg); - orderTaxi.setAbnormal(1); + orderTaxi.setAbnormal(2); this.baseMapper.updateById(orderTaxi); } @@ -2478,6 +2478,7 @@ BigDecimal bigDecimal = tDriverPromotionActivity.getCommissionRatio().divide(new BigDecimal(100), 2, RoundingMode.HALF_UP).multiply(new BigDecimal(payMoney)).setScale(2, RoundingMode.HALF_UP); orderTaxi.setPromotionDriverId(userInfo.getBindDriverId()); orderTaxi.setPromotionMoney(bigDecimal); + orderTaxi.setPromotionActivityId(tDriverPromotionActivity.getId()); this.baseMapper.updateById(orderTaxi); } } @@ -2491,4 +2492,29 @@ } } } + + @Override + public List<Map<String, Object>> queryMyTripList(Integer uid, Integer pageNum, Integer size) throws Exception { + pageNum = (pageNum - 1) * size; + List<Map<String, Object>> maps = orderTaxiMapper.queryMyTripList(uid, pageNum, size); + for (Map<String, Object> map : maps) { + if (Integer.valueOf(String.valueOf(map.get("state"))) == 11) { + map.put("state", map.get("oldState")); + } + } + return maps; + } + + @Override + public List<Map<String, Object>> queryMyTripListAll(Integer uid) throws Exception { + + List<Map<String, Object>> maps = orderTaxiMapper.queryMyTripListAll(uid); + for (Map<String, Object> map : maps) { + if (Integer.valueOf(String.valueOf(map.get("state"))) == 11) { + map.put("state", map.get("oldState")); + } + } + return maps; + } + } diff --git a/UserQYTTravel/guns-admin/src/main/resources/application.yml b/UserQYTTravel/guns-admin/src/main/resources/application.yml index 3d56997..8a3a7ca 100644 --- a/UserQYTTravel/guns-admin/src/main/resources/application.yml +++ b/UserQYTTravel/guns-admin/src/main/resources/application.yml @@ -33,14 +33,14 @@ host: 192.168.110.80 port: 6379 password: 123456 -# redis: -# host: 172.21.35.151 -# port: 6512 -# password: SC_cache@20#25 -# database: 0 -# timeout: 1000 -# cluster: -# nodes: 172.21.35.151:6512,172.21.35.152:6512,172.21.35.153:6512,172.21.35.151:6513,172.21.35.152:6513,172.21.35.153:6513 + # redis: + # host: 172.21.35.151 + # port: 6512 + # password: SC_cache@20#25 + # database: 0 + # timeout: 1000 + # cluster: + # nodes: 172.21.35.151:6512,172.21.35.152:6512,172.21.35.153:6512,172.21.35.151:6513,172.21.35.152:6513,172.21.35.153:6513 mybatis-plus: typeAliasesPackage: com.stylefeng.guns.modular @@ -72,13 +72,13 @@ filters: wall,mergeStat -#spring: -# datasource: -# url: jdbc:mysql://172.21.35.140:8066/traffic_scdb?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=CONVERT_TO_NULL&useSSL=false&serverTimezone=Asia/Shanghai -# username: traffic_scusr -# password: QYT_sc@20#25 -# db-name: traffic_scdb #用来搜集数据库的所有表 -# filters: wall,mergeStat + #spring: + # datasource: + # url: jdbc:mysql://172.21.35.140:8066/traffic_scdb?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=CONVERT_TO_NULL&useSSL=false&serverTimezone=Asia/Shanghai + # username: traffic_scusr + # password: QYT_sc@20#25 + # db-name: traffic_scdb #用来搜集数据库的所有表 + # filters: wall,mergeStat --- @@ -86,7 +86,7 @@ data: mongodb: uri: mongodb://192.168.110.80:27017/traveling_track -# uri: mongodb://qyt_jtcx:qyt_jtcx2025@172.21.35.195:27017,172.21.35.196:27017/traveling_track + # uri: mongodb://qyt_jtcx:qyt_jtcx2025@172.21.35.195:27017,172.21.35.196:27017/traveling_track --- @@ -127,3 +127,21 @@ #交通部推送数据功能开关 pushMinistryOfTransport: false + +#邮件配置 +spring: + mail: + host: smtp.qq.com + port: 465 + username: 1721849008@qq.com + password: nhnbmjfdywilcbdj # 这里是授权码,不是邮箱登录密码 + properties: + mail: + smtp: + ssl: + enable: true # 启用 SSL 加密(根据端口是否为 465 决定,通常需要开启) + auth: true # 启用身份验证(必须为 true) +# pdf生成位置 +trip: + sheet: + filePath: D:/qytPdf/ \ No newline at end of file diff --git a/UserQYTTravel/guns-admin/src/main/resources/static/fonts/AlibabaPuHuiTi-3-105-Heavy.ttf b/UserQYTTravel/guns-admin/src/main/resources/static/fonts/AlibabaPuHuiTi-3-105-Heavy.ttf new file mode 100644 index 0000000..3d865c2 --- /dev/null +++ b/UserQYTTravel/guns-admin/src/main/resources/static/fonts/AlibabaPuHuiTi-3-105-Heavy.ttf Binary files differ diff --git a/UserQYTTravel/guns-admin/src/main/resources/static/img/logo.png b/UserQYTTravel/guns-admin/src/main/resources/static/img/logo.png new file mode 100644 index 0000000..0576707 --- /dev/null +++ b/UserQYTTravel/guns-admin/src/main/resources/static/img/logo.png Binary files differ -- Gitblit v1.7.1