yangdamao 6 сар өмнө
parent
commit
3d9163a732

+ 14 - 0
zhongzheng-admin-saas/src/main/java/com/zhongzheng/controller/common/CommonController.java

@@ -10,6 +10,7 @@ import com.zhongzheng.common.enums.BusinessType;
 import com.zhongzheng.common.exception.CustomException;
 import com.zhongzheng.common.utils.ToolsUtils;
 import com.zhongzheng.common.utils.file.FileUtils;
+import com.zhongzheng.modules.order.bo.TopOrderInvoiceBack;
 import com.zhongzheng.modules.sdk.bo.TopNuoMplatformLogAddBo;
 import com.zhongzheng.modules.sdk.service.ITopNuoMplatformLogService;
 import com.zhongzheng.modules.top.financial.bo.*;
@@ -95,6 +96,19 @@ public class CommonController extends BaseController {
         return AjaxResult.success(iTopNuoMplatformLogService.insertByAddBo(bo));
     }
 
+
+    /**
+     * 业务系统发票回传
+     */
+    @ApiOperation("业务系统发票回传")
+    @PostMapping("/order/invoice/back")
+    public AjaxResult<Void> orderInvoiceBack(@RequestBody TopOrderInvoiceBack bo) {
+        if(!ToolsUtils.checkSignFromOldSys(bo.getStamp().toString(),bo.getSign())){
+            throw new CustomException("签名错误");
+        }
+        return toAjax(iTopNuoMplatformLogService.orderInvoiceBack(bo) ? 1 : 0);
+    }
+
     /**
      * B端订单退款申请
      */

+ 14 - 0
zhongzheng-admin/src/main/java/com/zhongzheng/controller/goods/GoodsController.java

@@ -412,6 +412,20 @@ public class GoodsController extends BaseController {
         return toAjax(iGoodsService.updateRecordUrl(boList,goodsId) ? 1 : 0);
     }
 
+
+    /**
+     * 视频节导入
+     */
+    @ApiOperation("视频节导入")
+    @PostMapping("/section/export")
+    public AjaxResult<Void> sectionExport(MultipartFile file,String json) {
+        List<SectionExportBo> boList = EasyPoiUtil.importExcel(file,0,1,SectionExportBo.class);
+        if (CollectionUtils.isEmpty(boList)){
+            throw new CustomException("导入文件格式不正确或文件为空,请检查文件!");
+        }
+        return toAjax(iGoodsService.sectionExport(boList,json) ? 1 : 0);
+    }
+
     /**
      * 二建商品更换腾讯
      */

+ 24 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/bo/SectionExportBo.java

@@ -0,0 +1,24 @@
+package com.zhongzheng.modules.goods.bo;
+
+import cn.afterturn.easypoi.excel.annotation.Excel;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author yangdamao
+ * @date 2024年06月04日 15:00
+ */
+@Data
+public class SectionExportBo implements Serializable {
+
+    @Excel(name = "视频名称")
+    private String sectionName;
+
+    @Excel(name = "视频Id")
+    private String sectionUrl;
+
+    @Excel(name = "章节名称")
+    private String chapterName;
+
+}

+ 2 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/service/IGoodsService.java

@@ -177,4 +177,6 @@ public interface IGoodsService extends IService<Goods> {
     boolean updateRecordUrl(List<SectionImportBo> boList, String goodsId);
 
 	boolean updateGoodsVideo(UpdateGoodsVideoBo bo);
+
+	boolean sectionExport(List<SectionExportBo> boList,String json);
 }

+ 116 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/service/impl/GoodsServiceImpl.java

@@ -78,6 +78,7 @@ import com.zhongzheng.modules.system.service.ISysConfigService;
 import com.zhongzheng.modules.system.service.ISysGoodsCopyRecordService;
 import com.zhongzheng.modules.system.service.ISysOldOrgService;
 import com.zhongzheng.modules.system.service.ISysTenantService;
+import com.zhongzheng.modules.tencentcloud.service.IVodService;
 import com.zhongzheng.modules.user.bo.SubjectStudyRecordQueryBo;
 import com.zhongzheng.modules.user.bo.UserPhoneBo;
 import com.zhongzheng.modules.user.bo.UserStudyRecordAddBo;
@@ -135,6 +136,9 @@ public class GoodsServiceImpl extends ServiceImpl<GoodsMapper, Goods> implements
     @Autowired
     private CourseMapper courseMapper;
 
+    @Autowired
+    private IVodService iVodService;
+
     @Autowired
     private ICourseService iCourseService;
 
@@ -5666,6 +5670,118 @@ public class GoodsServiceImpl extends ServiceImpl<GoodsMapper, Goods> implements
         return updateById(goods);
     }
 
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean sectionExport(List<SectionExportBo> boList,String json) {
+        if (CollectionUtils.isEmpty(boList)){
+            throw new CustomException("导入信息为空");
+        }
+        JSONObject jsonObject = JSONObject.parseObject(json);
+        String eduName = jsonObject.get("eduName").toString();
+        String businessName = jsonObject.get("businessName").toString();
+        String proName = jsonObject.get("proName").toString();
+        String subjectName = jsonObject.get("subjectName").toString();
+        String isPublic = jsonObject.get("isPublic").toString();
+
+        CourseEducationType educationType = iCourseEducationTypeService
+                .getOne(new LambdaQueryWrapper<CourseEducationType>().eq(CourseEducationType::getEducationName, eduName).eq(CourseEducationType::getStatus, 1).last("limit 1"));
+        Long eduId = educationType.getId();
+        CourseProjectType projectType = iCourseProjectTypeService
+                .getOne(new LambdaQueryWrapper<CourseProjectType>().eq(CourseProjectType::getProjectName, proName).eq(CourseProjectType::getEducationId, eduId).eq(CourseProjectType::getStatus, 1).last("limit 1"));
+        Long proId = projectType.getId();
+        CourseBusiness business = iCourseBusinessService
+                .getOne(new LambdaQueryWrapper<CourseBusiness>().eq(CourseBusiness::getBusinessName, businessName).eq(CourseBusiness::getProjectId, proId).eq(CourseBusiness::getStatus, 1).last("limit 1"));
+        Long businessId = business.getId();
+
+        List<Long> subjectIds = new ArrayList<>();
+        if (isPublic.equals("1")) {
+            //公共章
+            List<CourseSubjectProject> list = iCourseSubjectProjectService.list(new LambdaQueryWrapper<CourseSubjectProject>().eq(CourseSubjectProject::getProjectId, proId));
+            List<CourseSubject> courseSubjects = iCourseSubjectService.listByIds(list.stream().map(CourseSubjectProject::getSubjectId).collect(Collectors.toList()));
+            subjectIds.addAll(courseSubjects.stream().map(CourseSubject::getId).collect(Collectors.toList()));
+        }else {
+            List<CourseSubjectProject> list = iCourseSubjectProjectService.list(new LambdaQueryWrapper<CourseSubjectProject>().eq(CourseSubjectProject::getProjectId, proId));
+            List<Long> collect = list.stream().map(CourseSubjectProject::getSubjectId).collect(Collectors.toList());
+            CourseSubject one = iCourseSubjectService.getOne(new LambdaQueryWrapper<CourseSubject>().in(CourseSubject::getId, collect).eq(CourseSubject::getSubjectName, subjectName).last("limit 1"));
+            subjectIds.add(one.getId());
+        }
+
+
+        //根据章名称分组
+        Map<String, List<SectionExportBo>> listMap = boList.stream().collect(Collectors.groupingBy(SectionExportBo::getChapterName));
+
+        listMap.forEach((k,v) -> {
+
+            //添加章信息
+            CourseChapter courseChapter = new CourseChapter();
+            courseChapter.setName(k);
+            courseChapter.setPrefixName("20250617");
+            courseChapter.setCreateTime(DateUtils.getNowTime());
+            courseChapter.setUpdateTime(DateUtils.getNowTime());
+            courseChapter.setCode(ServletUtils.getEncoded("Z"));
+            courseChapter.setCoverUrl("oss/images/avatar/20211013/1634097664410_1397766697");
+            courseChapter.setStatus(1);
+            courseChapter.setPublishStatus(1L);
+            courseChapter.setCommonSign(isPublic);
+            courseChapter.setViewSign(2);
+            iCourseChapterService.save(courseChapter);
+
+            //添加章业务层次信息
+            subjectIds.forEach(subjectId -> {
+                CourseChapterBusiness chapterBusiness = new CourseChapterBusiness();
+                chapterBusiness.setBusinessId(businessId);
+                chapterBusiness.setProjectId(proId);
+                chapterBusiness.setEducationTypeId(eduId);
+                chapterBusiness.setSubjectId(subjectId);
+                chapterBusiness.setChapterId(courseChapter.getChapterId());
+                iCourseChapterBusinessService.save(chapterBusiness);
+            });
+
+            //添加章下面的节
+            for (int i = 0; i < v.size(); i++) {
+                SectionExportBo item = v.get(i);
+                CourseSection entity = new CourseSection();
+                entity.setName(item.getSectionName());
+                entity.setPrefixName("20250617");
+                entity.setSectionType(1);
+                entity.setPublishStatus(1);
+                entity.setRecordingUrl(item.getSectionUrl());
+                //视频时长
+                Map<String, Object> stringObjectMap = iVodService.describeMediaInfos(new String[]{item.getSectionUrl()});
+                Object duration = stringObjectMap.get("duration");
+                int num = (int) Double.parseDouble(duration.toString());
+                entity.setDurationTime(Long.valueOf(num));
+                entity.setCode(ServletUtils.getEncoded("J"));
+                entity.setCreateTime(DateUtils.getNowTime());
+                entity.setUpdateTime(DateUtils.getNowTime());
+                entity.setCoverUrl("oss/images/avatar/20211013/1634097664410_1397766697");
+                entity.setViewSign(2);
+                entity.setStatus(1);
+                iCourseSectionService.save(entity);
+
+                //添加节业务层次信息
+                subjectIds.forEach(subjectId -> {
+                    CourseSectionBusiness sectionBusiness = new CourseSectionBusiness();
+                    sectionBusiness.setBusinessId(businessId);
+                    sectionBusiness.setProjectId(proId);
+                    sectionBusiness.setEducationTypeId(eduId);
+                    sectionBusiness.setSubjectId(subjectId);
+                    sectionBusiness.setSectionId(entity.getSectionId());
+                    iCourseSectionBusinessService.save(sectionBusiness);
+                });
+
+                //添加章节关联
+                CourseChapterSection chapterSection = new CourseChapterSection();
+                chapterSection.setChapterId(courseChapter.getChapterId());
+                chapterSection.setSectionId(entity.getSectionId());
+                chapterSection.setSort(Long.valueOf(i+1));
+                iCourseChapterSectionService.save(chapterSection);
+            }
+
+        });
+        return true;
+    }
+
     private void updateHandoutsId(Long goodsId, Long tenantId, Long handoutsId) {
         baseMapper.updateHandoutsId(goodsId, tenantId, handoutsId);
     }

+ 15 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/service/impl/ClassGradeUserServiceImpl.java

@@ -100,6 +100,7 @@ import java.time.ZonedDateTime;
 import java.time.format.DateTimeFormatter;
 import java.time.temporal.TemporalAdjusters;
 import java.util.*;
+import java.util.regex.Pattern;
 import java.util.stream.Collectors;
 import java.util.zip.ZipOutputStream;
 
@@ -682,6 +683,9 @@ public class ClassGradeUserServiceImpl extends ServiceImpl<ClassGradeUserMapper,
         userVo.setRealName(ToolsUtils.removeAllTrim(userVo.getRealName()));
         userVo.setIdCard(ToolsUtils.removeAllTrim(userVo.getIdCard()));
         userVo.setTelPhone(ToolsUtils.removeAllTrim(userVo.getTelPhone()));
+        if (!isStrictValidChineseName(userVo.getRealName())) {
+            return "学员名称有误,请检查!";
+        }
         if(fullName.contains("继续教育")&&fullName.contains("施工现场专业人员")){
             return pushSevenOfficialInfo(bo,userVo,orderGoods,goods);
         }
@@ -764,6 +768,17 @@ public class ClassGradeUserServiceImpl extends ServiceImpl<ClassGradeUserMapper,
         }
     }
 
+    public static boolean isStrictValidChineseName(String name) {
+        if (name == null || name.trim().isEmpty()) {
+            return false;
+        }
+
+        // 正则表达式:只包含中文汉字
+        String regex = "^[\\u4e00-\\u9fa5]+$";
+
+        return Pattern.matches(regex, name);
+    }
+
 
     public String pushSevenOfficialInfo(ClassGradeUserQueryBo bo,ClassGradeUserVo userVo,OrderGoodsVo orderGoods,Goods goods) {
         String SEVEN_OFFICIALPUSH_INFOACCOUNT=null;

+ 32 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/order/bo/TopOrderInvoiceBack.java

@@ -0,0 +1,32 @@
+package com.zhongzheng.modules.order.bo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import java.io.Serializable;
+import java.util.List;
+
+@Data
+public class TopOrderInvoiceBack implements Serializable {
+
+
+    @ApiModelProperty("当前时间戳")
+    @NotBlank(message = "当前时间戳不能为空")
+    private Long stamp;
+
+    @ApiModelProperty("签名")
+    @NotBlank(message = "签名不能为空")
+    private String sign;
+
+    /** 订单号(每个企业唯一) */
+    @ApiModelProperty("订单号(每个企业唯一)")
+    private List<String> orderNos;
+
+    @ApiModelProperty("发票状态:0关闭 1开票中 2完成")
+    private Integer status;
+
+    /** 发票图片地址 */
+    @ApiModelProperty("oss地址")
+    private String invoiceUrl;
+}

+ 3 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/sdk/service/ITopNuoMplatformLogService.java

@@ -2,6 +2,7 @@ package com.zhongzheng.modules.sdk.service;
 
 
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.zhongzheng.modules.order.bo.TopOrderInvoiceBack;
 import com.zhongzheng.modules.sdk.bo.TopNuoMplatformLogAddBo;
 import com.zhongzheng.modules.sdk.bo.TopNuoMplatformLogEditBo;
 import com.zhongzheng.modules.sdk.bo.TopNuoMplatformLogQueryBo;
@@ -55,4 +56,6 @@ public interface ITopNuoMplatformLogService extends IService<TopNuoMplatformLog>
 	Boolean updateByBatch();
 
 	Boolean reOpenMplatform();
+
+	boolean orderInvoiceBack(TopOrderInvoiceBack bo);
 }

+ 139 - 37
zhongzheng-system/src/main/java/com/zhongzheng/modules/sdk/service/impl/TopNuoMplatformLogServiceImpl.java

@@ -16,6 +16,7 @@ import com.zhongzheng.modules.alioss.bo.OssRequest;
 import com.zhongzheng.modules.alioss.service.OssService;
 import com.zhongzheng.modules.grade.domain.ClassGradeUser;
 import com.zhongzheng.modules.grade.service.impl.UserPeriodServiceImpl;
+import com.zhongzheng.modules.order.bo.TopOrderInvoiceBack;
 import com.zhongzheng.modules.order.domain.OrderGoodsRefund;
 import com.zhongzheng.modules.order.domain.OrderInvoice;
 import com.zhongzheng.modules.order.service.IOrderInvoiceOrderService;
@@ -39,8 +40,13 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.github.pagehelper.Page;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.CollectionUtils;
 
 import java.io.IOException;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.net.URLEncoder;
+import java.nio.charset.StandardCharsets;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -125,43 +131,46 @@ public class TopNuoMplatformLogServiceImpl extends ServiceImpl<TopNuoMplatformLo
         add.setStatus(0);
         add.setCreateTime(DateUtils.getNowTime());
         add.setUpdateTime(DateUtils.getNowTime());
-        if(this.save(add)){
-            try{
-                Long id = add.getId();
-                Map<String,String> params = new HashMap<>();
-                params.put("content",bo.getContent());
-                String result = nuonuoService.openMplatform(params);
-                TopNuoMplatformLog update = new TopNuoMplatformLog();
-                update.setId(id);
-                update.setResult(result);
-                JSONObject jsonObject = (JSONObject) JSONObject.parse(result);
-                String code = String.valueOf(jsonObject.get("code"));
-                String describe = String.valueOf(jsonObject.get("describe"));
-                update.setResultCode(code);
-                Map<String,String> rs = new HashMap<>();
-                if("E0000".equals(code)){
-                    JSONObject resultObject = jsonObject.getJSONObject("result");
-                    String invoiceSerialNum = String.valueOf(resultObject.get("invoiceSerialNum"));
-                    update.setInvoiceSerialNum(invoiceSerialNum);
-                    update.setStatus(1);
-                    rs.put("invoiceSerialNum",invoiceSerialNum);
-                    update.setUpdateTime(DateUtils.getNowTime());
-                    updateById(update);
-
-                    rs.put("code",code);
-                    rs.put("describe",describe);
-                    return rs;
-                }else{
-                    update.setStatus(-1);
-                    update.setUpdateTime(DateUtils.getNowTime());
-                    updateById(update);
-                    throw new CustomException(result);
-                }
-            }catch (Exception e){
-                throw new CustomException("开票失败");
-            }
-        }
-        throw new CustomException("新增失败");
+        this.save(add);
+        return new HashMap<>();
+        //诺税通服务已暂停
+//        if(this.save(add)){
+//            try{
+//                Long id = add.getId();
+//                Map<String,String> params = new HashMap<>();
+//                params.put("content",bo.getContent());
+//                String result = nuonuoService.openMplatform(params);
+//                TopNuoMplatformLog update = new TopNuoMplatformLog();
+//                update.setId(id);
+//                update.setResult(result);
+//                JSONObject jsonObject = (JSONObject) JSONObject.parse(result);
+//                String code = String.valueOf(jsonObject.get("code"));
+//                String describe = String.valueOf(jsonObject.get("describe"));
+//                update.setResultCode(code);
+//                Map<String,String> rs = new HashMap<>();
+//                if("E0000".equals(code)){
+//                    JSONObject resultObject = jsonObject.getJSONObject("result");
+//                    String invoiceSerialNum = String.valueOf(resultObject.get("invoiceSerialNum"));
+//                    update.setInvoiceSerialNum(invoiceSerialNum);
+//                    update.setStatus(1);
+//                    rs.put("invoiceSerialNum",invoiceSerialNum);
+//                    update.setUpdateTime(DateUtils.getNowTime());
+//                    updateById(update);
+//
+//                    rs.put("code",code);
+//                    rs.put("describe",describe);
+//                    return rs;
+//                }else{
+//                    update.setStatus(-1);
+//                    update.setUpdateTime(DateUtils.getNowTime());
+//                    updateById(update);
+//                    throw new CustomException(result);
+//                }
+//            }catch (Exception e){
+//                throw new CustomException("开票失败");
+//            }
+//        }
+//        throw new CustomException("新增失败");
     }
 
     @Override
@@ -312,4 +321,97 @@ public class TopNuoMplatformLogServiceImpl extends ServiceImpl<TopNuoMplatformLo
         }
         return null;
     }
+
+
+    @Override
+    public boolean orderInvoiceBack(TopOrderInvoiceBack bo) {
+        if (CollectionUtils.isEmpty(bo.getOrderNos())){
+            throw new CustomException("发票ID不能为空");
+        }
+        switch (bo.getStatus()){
+            case 0://关闭
+                List<TopNuoMplatformLog> list = list(new LambdaQueryWrapper<TopNuoMplatformLog>()
+                        .in(TopNuoMplatformLog::getOrderNo, bo.getOrderNos()));
+                List<String> orderNos = new ArrayList<>();
+                list.stream().forEach(x -> {
+                    String orderNoList = x.getOrderNoList();
+                    orderNos.addAll(Arrays.asList(orderNoList.split(",")));
+                });
+                //更新发票状态
+                iTopOldOrderService.update(new LambdaUpdateWrapper<TopOldOrder>()
+                        .in(TopOldOrder::getOrderSn,orderNos)
+                        .set(TopOldOrder::getInvoiceStatus,2));
+                update(new LambdaUpdateWrapper<TopNuoMplatformLog>()
+                        .in(TopNuoMplatformLog::getOrderNo,bo.getOrderNos())
+                        .set(TopNuoMplatformLog::getStatus,0));
+                break;
+            case 1://已开票
+                //下载发票上传oss
+                try {
+
+                    // 编码中文文件名
+                    String invoiceUrl = bo.getInvoiceUrl();
+                    String pathurl = invoiceUrl.substring(0,invoiceUrl.lastIndexOf("/")+1);
+                    String fileName = invoiceUrl.substring(invoiceUrl.lastIndexOf("/") + 1);
+                    String encodedFileName = URLEncoder.encode(fileName, StandardCharsets.UTF_8.toString());
+                    String pdfUrl = pathurl + encodedFileName;
+
+                    URL url = new URL(pdfUrl);
+
+                    HttpURLConnection connection = (HttpURLConnection) url.openConnection();
+                    connection.setRequestMethod("GET");
+                    connection.setRequestProperty("User-Agent", "Mozilla/5.0");
+                    connection.setRequestProperty("Accept", "application/pdf");
+
+
+                    // 检查响应码(200表示成功)
+                    int responseCode = connection.getResponseCode();
+                    String path = "";
+                    if (responseCode == HttpURLConnection.HTTP_OK) {
+                        path = ossService.uploadInputStream(connection.getInputStream(), 11);
+                    }else {
+                        throw new CustomException("文件下载异常");
+                    }
+
+                    List<TopNuoMplatformLog> listLog = list(new LambdaQueryWrapper<TopNuoMplatformLog>()
+                            .in(TopNuoMplatformLog::getOrderNo, bo.getOrderNos()));
+                    List<String> orderNoList = new ArrayList<>();
+                    listLog.stream().forEach(x -> {
+                        orderNoList.addAll(Arrays.asList(x.getOrderNoList().split(",")));
+                    });
+                    //更新发票状态
+                    iTopOldOrderService.update(new LambdaUpdateWrapper<TopOldOrder>()
+                            .in(TopOldOrder::getOrderSn,orderNoList)
+                            .set(TopOldOrder::getInvoiceStatus,1));
+                    //填充发票信息
+                    update(new LambdaUpdateWrapper<TopNuoMplatformLog>()
+                            .in(TopNuoMplatformLog::getOrderNo,bo.getOrderNos())
+                            .set(TopNuoMplatformLog::getOssPdfUrl,path)
+                            .set(TopNuoMplatformLog::getUpdateTime,DateUtils.getNowTime())
+                            .set(TopNuoMplatformLog::getStatus,2));
+                }catch (Exception e){
+                    e.printStackTrace();
+                    throw new CustomException("文件下载异常");
+                }
+                break;
+            case 2://线下已开票
+                List<TopNuoMplatformLog> listLog = list(new LambdaQueryWrapper<TopNuoMplatformLog>()
+                        .in(TopNuoMplatformLog::getOrderNo, bo.getOrderNos()));
+                List<String> orderNoList = new ArrayList<>();
+                listLog.stream().forEach(x -> {
+                    orderNoList.addAll(Arrays.asList(x.getOrderNoList().split(",")));
+                });
+                //更新发票状态
+                iTopOldOrderService.update(new LambdaUpdateWrapper<TopOldOrder>()
+                        .in(TopOldOrder::getOrderSn,orderNoList)
+                        .set(TopOldOrder::getInvoiceStatus,3));
+                //填充发票信息
+                update(new LambdaUpdateWrapper<TopNuoMplatformLog>()
+                        .in(TopNuoMplatformLog::getOrderNo,bo.getOrderNos())
+                        .set(TopNuoMplatformLog::getUpdateTime,DateUtils.getNowTime())
+                        .set(TopNuoMplatformLog::getStatus,2));
+                break;
+        }
+        return true;
+    }
 }