新增:发票开具接口、等等

This commit is contained in:
2024-07-05 10:07:41 +08:00
parent 4d2921a1e5
commit 6fd4e5a383
16 changed files with 287 additions and 11 deletions
+8
View File
@@ -272,6 +272,14 @@
<version>3.17.0</version> <version>3.17.0</version>
</dependency> </dependency>
<!--诺诺开票接口-->
<dependency>
<groupId>com.nuonuo</groupId>
<artifactId>open-sdk</artifactId>
<version>1.0.5.2</version>
</dependency>
</dependencies> </dependencies>
<build> <build>
@@ -45,7 +45,7 @@ public class MatchController extends BaseController {
return success(matchService.listRel(param)); return success(matchService.listRel(param));
} }
@PreAuthorize("hasAuthority('booking:match:list')")
@ApiOperation("根据id查询比赛信息表") @ApiOperation("根据id查询比赛信息表")
@GetMapping("/{id}") @GetMapping("/{id}")
public ApiResult<Match> get(@PathVariable("id") Integer id) { public ApiResult<Match> get(@PathVariable("id") Integer id) {
@@ -1,5 +1,6 @@
package com.gxwebsoft.booking.controller; package com.gxwebsoft.booking.controller;
import com.gxwebsoft.common.core.exception.BusinessException;
import com.gxwebsoft.common.core.web.BaseController; import com.gxwebsoft.common.core.web.BaseController;
import com.gxwebsoft.booking.service.MatchOrderService; import com.gxwebsoft.booking.service.MatchOrderService;
import com.gxwebsoft.booking.entity.MatchOrder; import com.gxwebsoft.booking.entity.MatchOrder;
@@ -88,6 +89,20 @@ public class MatchOrderController extends BaseController {
@ApiOperation("批量添加比赛报名记录表") @ApiOperation("批量添加比赛报名记录表")
@PostMapping("/batch") @PostMapping("/batch")
public ApiResult<?> saveBatch(@RequestBody List<MatchOrder> list) { public ApiResult<?> saveBatch(@RequestBody List<MatchOrder> list) {
for(MatchOrder item : list){
if(item.getName() == null){
return fail("姓名不能为空");
}
if(item.getPhone() == null){
return fail("电话号码不能为空");
}
if(item.getIdCardNo() == null){
return fail("身份证号不能为空");
}
}
list.forEach(d->{
d.setUserId(getLoginUserId());
});
if (matchOrderService.saveBatch(list)) { if (matchOrderService.saveBatch(list)) {
return success("添加成功"); return success("添加成功");
} }
@@ -1,5 +1,12 @@
package com.gxwebsoft.booking.controller; package com.gxwebsoft.booking.controller;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.StrUtil;
import com.gxwebsoft.booking.entity.NuoNuo;
import com.gxwebsoft.booking.entity.NuoNuoGoods;
import com.gxwebsoft.booking.entity.NuoNuoOrder;
import com.gxwebsoft.common.core.utils.JSONUtil;
import com.gxwebsoft.common.core.web.BaseController; import com.gxwebsoft.common.core.web.BaseController;
import com.gxwebsoft.booking.service.UserInvoiceService; import com.gxwebsoft.booking.service.UserInvoiceService;
import com.gxwebsoft.booking.entity.UserInvoice; import com.gxwebsoft.booking.entity.UserInvoice;
@@ -12,11 +19,14 @@ import com.gxwebsoft.common.core.annotation.OperationLog;
import com.gxwebsoft.common.system.entity.User; import com.gxwebsoft.common.system.entity.User;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import nuonuo.open.sdk.NNOpenSDK;
import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.UUID;
/** /**
* 发票控制器 * 发票控制器
@@ -112,4 +122,51 @@ public class UserInvoiceController extends BaseController {
return fail("删除失败"); return fail("删除失败");
} }
@ApiOperation("开具发票")
@GetMapping("/doInvoice/{id}")
public ApiResult<?> doInvoice(@PathVariable("id") Integer id) {
final UserInvoice userInvoice = userInvoiceService.getByIdRel(id);
// 开票接口
NNOpenSDK sdk = NNOpenSDK.getIntance();
String taxnum = "339901999999142";//ISV下授权商户税号,自用型应用置""即可
String appKey = "SD56531018";
String appSecret = "SD3C429B318C485E";
String method = "nuonuo.OpeMplatform.requestBillingNew";//API方法名
String token = NNOpenSDK.getIntance().getMerchantToken("SD56531018","SD3C429B318C485E"); //访问令牌
final NuoNuo nuoNuo = new NuoNuo();
final NuoNuoOrder order = new NuoNuoOrder();
order.setBuyerName(userInvoice.getName());
order.setSalerTaxNum("339901999999142");
order.setSalerTel("339901999999142");
order.setOrderNo(Long.toString(IdUtil.getSnowflakeNextId()));
order.setInvoiceDate(DateUtil.now());
order.setClerk("张三");
order.setBuyerPhone(userInvoice.getPhone());
order.setInvoiceType("1");
final NuoNuoGoods goods = new NuoNuoGoods();
goods.setGoodsName(userInvoice.getComments());
goods.setWithTaxFlag("0");
goods.setDField1("综合馆羽毛球馆 2024-05-16 (星期四) 18:00 - 20:00");
goods.setDField2("无");
goods.setDField3("无");
goods.setDField4("无");
goods.setDField5("无");
goods.setTax("0.12");
goods.setTaxRate("0.13");
goods.setTaxExcludedAmount("0.88");
goods.setTaxIncludedAmount("1");
order.setInvoiceDetail(goods);
nuoNuo.setOrder(order);
String content = JSONUtil.toJSONString(nuoNuo);//API私有请求参数
String url = "https://sandbox.nuonuocs.cn/open/v1/services"; //SDK请求地址
String senid = UUID.randomUUID().toString(); // 唯一标识,由企业自己生成32位随机码
String json = sdk.sendPostSyncRequest(url, senid, appKey, appSecret, token, taxnum, method, content); // 请求API
System.out.println("json = " + json);
if (StrUtil.isNotBlank(json)) {
return success("发票开具成功",json);
}
return fail("发票开具失败");
}
} }
@@ -38,7 +38,7 @@ public class MatchOrder implements Serializable {
private String address; private String address;
@ApiModelProperty(value = "姓名") @ApiModelProperty(value = "姓名")
private Integer name; private String name;
@ApiModelProperty(value = "性别") @ApiModelProperty(value = "性别")
private Integer sex; private Integer sex;
@@ -0,0 +1,28 @@
package com.gxwebsoft.booking.entity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableLogic;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serializable;
import java.util.Date;
/**
* 发票
*
* @author 科技小王子
* @since 2024-05-25 17:20:15
*/
@Data
@EqualsAndHashCode(callSuper = false)
@ApiModel(value = "NuoNuo开票对象", description = "开票对象")
public class NuoNuo implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "订单信息")
@TableField(exist = false)
private NuoNuoOrder order;
}
@@ -0,0 +1,67 @@
package com.gxwebsoft.booking.entity;
import com.baomidou.mybatisplus.annotation.TableField;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serializable;
/**
* 发票
*
* @author 科技小王子
* @since 2024-05-25 17:20:15
*/
@Data
@EqualsAndHashCode(callSuper = false)
@ApiModel(value = "NuoNuo开票对象", description = "开票对象")
public class NuoNuoGoods implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "商品名称")
@TableField(exist = false)
private String goodsName;
@ApiModelProperty(value = "单价含税标志:0:不含税,1:含税")
@TableField(exist = false)
private String withTaxFlag;
@ApiModelProperty(value = "税额")
@TableField(exist = false)
private String tax;
@ApiModelProperty(value = "税率,注:1、纸票清单红票存在为null的情况;2、二手车发票税率为null或者0")
@TableField(exist = false)
private String taxRate;
@ApiModelProperty(value = "不含税金额")
@TableField(exist = false)
private String taxExcludedAmount;
@ApiModelProperty(value = "含税金额")
@TableField(exist = false)
private String taxIncludedAmount;
@ApiModelProperty(value = "业务方明细自定义字段1,本应用只作保存")
@TableField(exist = false)
private String dField1;
@ApiModelProperty(value = "业务方明细自定义字段1,本应用只作保存")
@TableField(exist = false)
private String dField2;
@ApiModelProperty(value = "业务方明细自定义字段1,本应用只作保存")
@TableField(exist = false)
private String dField3;
@ApiModelProperty(value = "业务方明细自定义字段1,本应用只作保存")
@TableField(exist = false)
private String dField4;
@ApiModelProperty(value = "业务方明细自定义字段1,本应用只作保存")
@TableField(exist = false)
private String dField5;
}
@@ -0,0 +1,80 @@
package com.gxwebsoft.booking.entity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serializable;
import java.util.Date;
/**
* 发票
*
* @author 科技小王子
* @since 2024-05-25 17:20:15
*/
@Data
@EqualsAndHashCode(callSuper = false)
@ApiModel(value = "NuoNuo开票对象", description = "开票对象")
@TableName("booking_user_invoice")
public class NuoNuoOrder implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "购方名称")
@TableField(exist = false)
private String buyerName;
@ApiModelProperty(value = "购方税号")
@TableField(exist = false)
private String buyerTaxNum;
@ApiModelProperty(value = "销方税号号(使用沙箱环境请求时消息体参数salerTaxNum和消息头参数userTax填写339902999999789113)")
@TableField(exist = false)
private String salerTaxNum;
@ApiModelProperty(value = "销方电话")
@TableField(exist = false)
private String salerTel;
@ApiModelProperty(value = "销方地址")
@TableField(exist = false)
private String salerAddress;
@ApiModelProperty(value = "订单编号")
@TableField(exist = false)
private String orderNo;
@ApiModelProperty(value = "订单时间")
@TableField(exist = false)
private String invoiceDate;
@ApiModelProperty(value = "开票员")
@TableField(exist = false)
private String clerk;
@ApiModelProperty(value = "购方手机号")
@TableField(exist = false)
private String buyerPhone;
@ApiModelProperty(value = "推送邮箱")
@TableField(exist = false)
private String email;
@ApiModelProperty(value = "开票类型:1:蓝票;2:红票 (数电票冲红请对接数电快捷冲红接口)")
@TableField(exist = false)
private String invoiceType;
@ApiModelProperty(value = "开票明细")
@TableField(exist = false)
private NuoNuoGoods invoiceDetail;
@ApiModelProperty(value = "完整字段名invoiceTractorAndCombineHarvester,开具拖拉机和联合收割机特定要素的数电票才需要传specificFactor =13)")
@TableField(exist = false)
private String invoiceTractorAndCombineH;
}
@@ -21,7 +21,7 @@
AND a.address LIKE CONCAT('%', #{param.address}, '%') AND a.address LIKE CONCAT('%', #{param.address}, '%')
</if> </if>
<if test="param.name != null"> <if test="param.name != null">
AND a.name = #{param.name} AND a.name LIKE CONCAT('%', #{param.name}, '%')
</if> </if>
<if test="param.sex != null"> <if test="param.sex != null">
AND a.sex = #{param.sex} AND a.sex = #{param.sex}
@@ -39,8 +39,7 @@ public class MatchOrderParam extends BaseParam {
private String address; private String address;
@ApiModelProperty(value = "姓名") @ApiModelProperty(value = "姓名")
@QueryField(type = QueryType.EQ) private String name;
private Integer name;
@ApiModelProperty(value = "性别") @ApiModelProperty(value = "性别")
@QueryField(type = QueryType.EQ) @QueryField(type = QueryType.EQ)
@@ -93,6 +93,10 @@ public class WebsiteController extends BaseController {
// redisUtil.set("Domain:xn--15qx69a6lbn8t0tlmve.com",10157); // redisUtil.set("Domain:xn--15qx69a6lbn8t0tlmve.com",10157);
// redisUtil.set("Domain:oa.gxwebsoft.com",5); // redisUtil.set("Domain:oa.gxwebsoft.com",5);
// redisUtil.set("Domain:gxwebsoft.com",5); // redisUtil.set("Domain:gxwebsoft.com",5);
if(tenantId.equals(0)){
return fail("租户ID不存在",null);
}
// 从缓存读取信息 // 从缓存读取信息
if(StrUtil.isNotBlank(siteInfo)){ if(StrUtil.isNotBlank(siteInfo)){
return success(JSONObject.parseObject(siteInfo,Website.class)); return success(JSONObject.parseObject(siteInfo,Website.class));
@@ -65,7 +65,8 @@ public class MybatisPlusConfig {
"sys_dictionary_data", "sys_dictionary_data",
"apps_test_data", "apps_test_data",
"shop_order", "shop_order",
"shop_order_info" "shop_order_info",
"booking_user_invoice"
).contains(tableName); ).contains(tableName);
} }
}; };
@@ -9,10 +9,7 @@ import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.gxwebsoft.common.core.annotation.OperationLog; import com.gxwebsoft.common.core.annotation.OperationLog;
import com.gxwebsoft.common.core.utils.CommonUtil; import com.gxwebsoft.common.core.utils.CommonUtil;
import com.gxwebsoft.common.core.web.*; import com.gxwebsoft.common.core.web.*;
import com.gxwebsoft.common.system.entity.DictionaryData; import com.gxwebsoft.common.system.entity.*;
import com.gxwebsoft.common.system.entity.Organization;
import com.gxwebsoft.common.system.entity.Role;
import com.gxwebsoft.common.system.entity.User;
import com.gxwebsoft.common.system.param.UserImportParam; import com.gxwebsoft.common.system.param.UserImportParam;
import com.gxwebsoft.common.system.param.UserParam; import com.gxwebsoft.common.system.param.UserParam;
import com.gxwebsoft.common.system.service.DictionaryDataService; import com.gxwebsoft.common.system.service.DictionaryDataService;
@@ -88,6 +85,16 @@ public class UserController extends BaseController {
return fail("添加失败"); return fail("添加失败");
} }
@PreAuthorize("hasAuthority('sys:user:save')")
@ApiOperation("批量添加用户")
@PostMapping("/batch")
public ApiResult<?> saveBatch(@RequestBody List<User> userList) {
if (userService.saveBatch(userList)) {
return success("添加成功");
}
return fail("添加失败");
}
@PreAuthorize("hasAuthority('sys:user:update')") @PreAuthorize("hasAuthority('sys:user:update')")
@ApiOperation("修改用户") @ApiOperation("修改用户")
@PutMapping() @PutMapping()
@@ -110,6 +110,12 @@
#{item} #{item}
</foreach> </foreach>
</if> </if>
<if test="param.phones != null">
AND a.phones IN
<foreach collection="param.phones" item="item" separator="," open="(" close=")">
#{item}
</foreach>
</if>
<if test="param.province != null"> <if test="param.province != null">
AND a.province LIKE CONCAT('%', #{param.province}, '%') AND a.province LIKE CONCAT('%', #{param.province}, '%')
</if> </if>
@@ -190,6 +190,10 @@ public class UserParam extends BaseParam {
@TableField(exist = false) @TableField(exist = false)
private Set<Integer> userIds; private Set<Integer> userIds;
@ApiModelProperty("用户手机号码集合")
@TableField(exist = false)
private Set<String> phones;
@ApiModelProperty("是否查询用户详细资料表") @ApiModelProperty("是否查询用户详细资料表")
@TableField(exist = false) @TableField(exist = false)
private Boolean showProfile; private Boolean showProfile;
@@ -27,7 +27,7 @@ import lombok.EqualsAndHashCode;
public class Users implements Serializable { public class Users implements Serializable {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
@TableId(value = "user_id", type = IdType.AUTO) @TableId(value = "uid", type = IdType.AUTO)
private Integer uid; private Integer uid;
@ApiModelProperty(value = "用户唯一小程序id") @ApiModelProperty(value = "用户唯一小程序id")