ruoyi-admin/src/main/java/com/ruoyi/web/controller/project/CasePanoramaController.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,97 @@ package com.ruoyi.web.controller.project; import com.ruoyi.common.annotation.Log; import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.enums.BusinessType; import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.project.domain.CasePanorama; import com.ruoyi.project.domain.CasePanoramaReq; import com.ruoyi.project.service.ICasePanoramaService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.math.BigDecimal; import java.util.List; /** * æ¡ä¾å ¨æ¯ * * @author ruoyi * @date 2026-10-28 */ @Slf4j @Api("æ¡ä¾å ¨æ¯") @RestController @RequestMapping("/project/casePanorama") public class CasePanoramaController extends BaseController { @Autowired private ICasePanoramaService casePanoramaService; /** * æ¥è¯¢æ¡ä¾å ¨æ¯ */ @ApiOperation("æ¥è¯¢æ¡ä¾å ¨æ¯") @GetMapping("/list") public TableDataInfo list(CasePanoramaReq req) { startPage(); return getDataTable(casePanoramaService.selectCasePanoramaList(req)); } /** * å¯¼åºæ¡ä¾å ¨æ¯ */ @ApiOperation("å¯¼åºæ¡ä¾å ¨æ¯") @Log(title = "æ¡ä¾å ¨æ¯", businessType = BusinessType.EXPORT) @GetMapping("/export") public AjaxResult export(CasePanoramaReq req) { List<CasePanorama> list = casePanoramaService.selectCasePanoramaList(req); for (CasePanorama row : list) { blankZero(row); } ExcelUtil<CasePanorama> util = new ExcelUtil<CasePanorama>(CasePanorama.class); return util.exportExcel(list, "æ¡ä¾å ¨æ¯æ°æ®"); } /** * ä¸å¡ç»ä¸æé项 */ @ApiOperation("ä¸å¡ç»ä¸æé项") @GetMapping("/deptOptions") public AjaxResult deptOptions() { return AjaxResult.success(casePanoramaService.selectDeptNames()); } /** * éé¢ 0 导åºä¸ºç©º */ private void blankZero(CasePanorama row) { row.setTotalCost(blankZero(row.getTotalCost())); row.setDonorFamilyCost(blankZero(row.getDonorFamilyCost())); row.setMedCost(blankZero(row.getMedCost())); row.setExpertCost(blankZero(row.getExpertCost())); row.setItemCode34(blankZero(row.getItemCode34())); row.setItemCode42(blankZero(row.getItemCode42())); row.setItemCode46(blankZero(row.getItemCode46())); row.setItemCode50(blankZero(row.getItemCode50())); row.setItemCode44(blankZero(row.getItemCode44())); row.setItemCode47(blankZero(row.getItemCode47())); row.setItemCode48(blankZero(row.getItemCode48())); row.setItemCode21(blankZero(row.getItemCode21())); row.setItemCode12(blankZero(row.getItemCode12())); row.setItemCode17(blankZero(row.getItemCode17())); row.setItemCode23(blankZero(row.getItemCode23())); row.setItemCode25(blankZero(row.getItemCode25())); } private BigDecimal blankZero(BigDecimal value) { return (value == null || value.compareTo(BigDecimal.ZERO) == 0) ? null : value; } } ruoyi-common/src/main/java/com/ruoyi/common/tax/TaxtUtils.java
@@ -66,6 +66,10 @@ /** * éè¿ç¨åå·¥èµï¼ç®åºç¨åå·¥èµ * <p> * 注æï¼é¤æ°å¿ é¡»ç¨å符串/常éæé ç精确å¼ãåå åæ {@code new BigDecimal(0.84)} çï¼ * 伿 double çäºè¿å¶è¯¯å·®å¸¦è¿é¤æ³ï¼å¦ 8313.06 / 0.84 åæ 9896.500000â¦001ï¼ï¼ * åå å åä¸åæ´å°±å¤åº 1 åé±ï¼å¯¼è´âç¨ååç®ç¨åâæ æ³è¿åï¼8300.00 ç±»éé¢åè§£åº 10000.03ï¼ã * * @param money * @return @@ -78,21 +82,21 @@ } //第ä¸ä¸ªåæ°æ¯é¤æ°ï¼ç¬¬äºä¸ªåæ°ä»£è¡¨ä¿çå ä½å°æ°ï¼ç¬¬ä¸ä¸ªä»£è¡¨çæ¯ä½¿ç¨çæ¨¡å¼ if (money.doubleValue() > 800 && money.doubleValue() <= 3360) { taxMoney = money.subtract(new BigDecimal(160)).divide(new BigDecimal(0.8), 2, BigDecimal.ROUND_CEILING); taxMoney = money.subtract(new BigDecimal(160)).divide(new BigDecimal("0.8"), 2, BigDecimal.ROUND_CEILING); } if (money.doubleValue() > 3360 && money.doubleValue() <= 21000) { taxMoney = money.divide(new BigDecimal(0.84), 2, BigDecimal.ROUND_CEILING); taxMoney = money.divide(new BigDecimal("0.84"), 2, BigDecimal.ROUND_CEILING); } if (money.doubleValue() > 21000 && money.doubleValue() <= 49500) { money = money.subtract(new BigDecimal(2000)); taxMoney = money.divide(new BigDecimal(0.76), 2, BigDecimal.ROUND_CEILING); taxMoney = money.divide(new BigDecimal("0.76"), 2, BigDecimal.ROUND_CEILING); } if (money.doubleValue() > 49500) { money = money.subtract(new BigDecimal(7000)); taxMoney = money.divide(new BigDecimal(0.68), 2, BigDecimal.ROUND_CEILING); taxMoney = money.divide(new BigDecimal("0.68"), 2, BigDecimal.ROUND_CEILING); } ruoyi-framework/src/main/java/com/ruoyi/framework/config/JacksonDateConfig.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,272 @@ package com.ruoyi.framework.config; import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.core.JsonToken; import com.fasterxml.jackson.databind.BeanDescription; import com.fasterxml.jackson.databind.BeanProperty; import com.fasterxml.jackson.databind.DeserializationConfig; import com.fasterxml.jackson.databind.DeserializationContext; import com.fasterxml.jackson.databind.JsonDeserializer; import com.fasterxml.jackson.databind.JsonSerializer; import com.fasterxml.jackson.databind.SerializationConfig; import com.fasterxml.jackson.databind.SerializerProvider; import com.fasterxml.jackson.databind.deser.BeanDeserializerBuilder; import com.fasterxml.jackson.databind.deser.BeanDeserializerModifier; import com.fasterxml.jackson.databind.deser.SettableBeanProperty; import com.fasterxml.jackson.databind.introspect.AnnotatedMember; import com.fasterxml.jackson.databind.module.SimpleModule; import com.fasterxml.jackson.databind.ser.BeanPropertyWriter; import com.fasterxml.jackson.databind.ser.BeanSerializerModifier; import com.fasterxml.jackson.databind.ser.ContextualSerializer; import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer; import org.slf4j.LoggerFactory; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import java.io.IOException; import java.text.ParsePosition; import java.text.SimpleDateFormat; import java.time.Instant; import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.Arrays; import java.util.Date; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Set; import java.util.TimeZone; /** * æ¶é´æ ¼å¼å ¨å±é ç½®ï¼æ¥å£åºåä¸å¾ç²¾ç¡®å°åï¼{@code yyyy-MM-dd HH:mm}ï¼ï¼å ¥å宽æ¾å ¼å®¹å¸¦/ä¸å¸¦ç§ã * * <p><b>为ä»ä¹ç¨å ¨å±é ç½®è䏿¯éåæ®µæ¹æ³¨è§£ï¼</b>ç³»ç»é * {@code @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss")} æ 182 å¤ã{@code @DateTimeFormat} 73 å¤ï¼ * éä¸ªæ¹æ¢å®¹ææ¼ï¼æ¼ä¸å¤å°±æ¯æäº¤ 400ï¼ï¼ä¹è¦çä¸å°æªå 注解ç {@code Date} åæ®µã * è¿éç¨ Jackson ç {@link BeanSerializerModifier} / {@link BeanDeserializerModifier} * å¨<b>䏿¹ä»»ä½æ³¨è§£</b>çåæä¸ç»ä¸æ ¼å¼åå£å¾ã * * <p><b>è§åï¼</b> * <ol> * <li>åºååï¼ææ {@code Date} è¾åº {@code yyyy-MM-dd HH:mm}ï¼æ²¿ç¨ * {@link ApplicationConfig} é ç½®ç JVM é»è®¤æ¶åºï¼åæ®µä¸æ¾å¼å£°æäº * {@code @JsonFormat(timezone=...)} çä»æå ¶æ¶åºï¼ï¼</li> * <li>ååºååï¼å ¼å®¹ {@code yyyy-MM-dd HH:mm:ss} / {@code yyyy-MM-dd HH:mm} / * {@code yyyy-MM-dd} / ææ åé / ISO8601 / æ¶é´æ³ ââ è¿æ ·å端åå¡«"æ ç§"çå¼åæ ·æäº¤ä¹ä¸ä¼ 400ï¼</li> * <li>è¿ç»´æ¥å¿ï¼æä½æ¥å¿/ç»å½æ¥å¿/宿¶ä»»å¡æ¥å¿ï¼<b>ä¿çç§</b>ï¼ä¾¿äºææ¥é®é¢ã</li> * </ol> * * <p><b>ä¸å½±åçèå´ï¼</b>æ°æ®åºåå¨ï¼ä»ä¸º datetimeï¼ç§ä½ç §å¸¸ä¿çï¼ã * Excel å¯¼å ¥å¯¼åºï¼èµ° {@code @Excel.dateFormat}ï¼æªæ¹å¨ï¼ã * è´è¿å忍鿥æï¼èªå»º {@code SimpleDateFormat}ï¼æªæ¹å¨ï¼ã * ééæ¶æ¯æ¶é´ï¼{@code FundNotifyMessageBuilder} èªå»ºæ ¼å¼ï¼ã * * @author ruoyi */ @Configuration public class JacksonDateConfig { /** æ ç§æ ¼å¼ */ private static final String PATTERN_NO_SECONDS = "yyyy-MM-dd HH:mm"; /** æç§æ ¼å¼ï¼è¿ç»´æ¥å¿ç¨ï¼ */ private static final String PATTERN_WITH_SECONDS = "yyyy-MM-dd HH:mm:ss"; /** ä¿çç§çç±»ï¼è¿ç»´æ¥å¿ï¼ç§å¯¹ææ¥æç¨ */ private static final Set<String> KEEP_SECONDS_CLASSES = new HashSet<String>(Arrays.asList( "com.ruoyi.system.domain.SysOperLog", "com.ruoyi.system.domain.SysLogininfor", "com.ruoyi.quartz.domain.SysJobLog" )); /** ååºååå°è¯é¡ºåºï¼ä»æå ·ä½å°æå®½æ¾ */ private static final String[] PARSE_PATTERNS = new String[]{ "yyyy-MM-dd HH:mm:ss.SSS", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm", "yyyy-MM-dd'T'HH:mm:ss.SSS", "yyyy-MM-dd'T'HH:mm:ss", "yyyy-MM-dd'T'HH:mm", "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm", "yyyy-MM-dd", "yyyy/MM/dd", "yyyyMMddHHmmss", "yyyyMMdd" }; /** * 2026-10-15 æ¹é ï¼ä¸åç¨ {@code Jackson2ObjectMapperBuilderCustomizer} + {@code modulesToInstall}ã * * <p><b>为ä»ä¹æ¹ï¼</b>{@code Jackson2ObjectMapperBuilder.modulesToInstall(...)} çè¯ä¹æ¯ * "设置"模åå表ï¼ä¸æ¯è¿½å ï¼ï¼è Spring Boot èªèº«ä¹ç¨å䏿¹æ³æ³¨åå®èªå¸¦ç模åï¼JavaTime çï¼ï¼ * 两个å®å¶å¨äºç¸è¦çï¼è°åæ§è¡è°çå表çæã宿µåæï¼æ¬æ¨¡å被丢æ ââ * 表ç°ä¸º"ç±»å¨å éãbean ä¹å建äºï¼ä½ Date ç宽æ¾è§£æä¸å»ç§åºååé½ä¸èµ·ä½ç¨"ï¼ * å端æ {@code yyyy-MM-dd} æäº¤æ¶ç´æ¥ 400ï¼Cannot deserialize ... expected format yyyy-MM-dd HH:mm:ssï¼ã * * <p>æ¹ä¸ºææ¨¡åå£°ææ {@code SimpleModule} beanï¼Spring Boot éè¿ {@code ObjectProvider<Module>} * ç»ä¸æ¶éææ Module bean 并䏿¬¡æ§å®è£ ï¼ä¸å®å¶å¨çæ§è¡é¡ºåºæ å ³ã */ @Bean public SimpleModule dateNoSecondsModule() { SimpleModule module = new SimpleModule("dateNoSecondsModule"); module.addSerializer(Date.class, new NoSecondsDateSerializer()); module.setSerializerModifier(new NoSecondsDateSerializerModifier()); module.setDeserializerModifier(new LenientDateDeserializerModifier()); // å¯å¨èªè¯ï¼è¿æ¡æ¥å¿åºç°å³è¯´ææ¨¡å已被å建并ä¼è¢« Spring Boot å®è£ LoggerFactory.getLogger(JacksonDateConfig.class).info( "[JacksonDateConfig] å·²å¯ç¨ï¼Date åºåå»ç§({})ï¼å ¥å宽æ¾å ¼å®¹({})", PATTERN_NO_SECONDS, String.join(" / ", PARSE_PATTERNS)); return module; } /** * åºååå¨ï¼æåéè¾åºã * åªä½ç¨äºåºååï¼<b>ä¸å½±åå ¥åè§£æ</b>ã */ static class NoSecondsDateSerializer extends JsonSerializer<Date> implements ContextualSerializer { private final DateTimeFormatter formatter; NoSecondsDateSerializer() { this.formatter = null; } private NoSecondsDateSerializer(TimeZone timeZone, boolean keepSeconds) { this.formatter = DateTimeFormatter .ofPattern(keepSeconds ? PATTERN_WITH_SECONDS : PATTERN_NO_SECONDS) .withZone((timeZone == null ? TimeZone.getDefault() : timeZone).toZoneId()); } @Override public JsonSerializer<?> createContextual(SerializerProvider prov, BeanProperty property) { TimeZone timeZone = resolveTimeZone(prov.getConfig().getTimeZone(), property == null ? null : property.getMember()); return new NoSecondsDateSerializer(timeZone, isKeepSeconds(property == null ? null : property.getMember())); } @Override public void serialize(Date value, JsonGenerator gen, SerializerProvider serializers) throws IOException { if (value == null) { gen.writeNull(); return; } if (formatter != null) { gen.writeString(formatter.format(value.toInstant())); return; } // å åºï¼æªè¢« contextualize æ¶æå½åé ç½®æ¶åºãæ ç§è¾åº gen.writeString(DateTimeFormatter.ofPattern(PATTERN_NO_SECONDS) .withZone(serializers.getConfig().getTimeZone().toZoneId()) .format(value.toInstant())); } } /** * 让 Bean 屿§ä¸çæ¥æä¹èµ°ä¸é¢çåºååå¨ã * åæ®µçº§ {@code @JsonFormat} çæçåºååå¨ä¼å 级æ´é«ï¼å¿ é¡»å¨è¿éæ¿æ¢æï¼å¦åæ³¨è§£åæ®µä»å¸¦ç§ã */ static class NoSecondsDateSerializerModifier extends BeanSerializerModifier { @Override @SuppressWarnings({"unchecked", "rawtypes"}) public List<BeanPropertyWriter> changeProperties(SerializationConfig config, BeanDescription beanDesc, List<BeanPropertyWriter> beanProperties) { boolean keepSeconds = KEEP_SECONDS_CLASSES.contains(beanDesc.getBeanClass().getName()); for (BeanPropertyWriter writer : beanProperties) { if (Date.class.isAssignableFrom(writer.getType().getRawClass())) { TimeZone timeZone = resolveTimeZone(config.getTimeZone(), writer.getMember()); writer.assignSerializer((JsonSerializer) new NoSecondsDateSerializer(timeZone, keepSeconds)); } } return beanProperties; } } /** * å ¥åè§£æï¼å ¼å®¹å¸¦ç§/ä¸å¸¦ç§/çº¯æ¥æ/ISO/æ¶é´æ³ï¼é¿å "åºåæ ç§ãåå¡«ååæäº¤"å¯¼è´ 400ã */ static class LenientDateDeserializerModifier extends BeanDeserializerModifier { @Override @SuppressWarnings({"unchecked", "rawtypes"}) public BeanDeserializerBuilder updateBuilder(DeserializationConfig config, BeanDescription beanDesc, BeanDeserializerBuilder builder) { Iterator<SettableBeanProperty> properties = builder.getProperties(); List<SettableBeanProperty> replaced = new ArrayList<SettableBeanProperty>(); while (properties.hasNext()) { SettableBeanProperty property = properties.next(); if (property.getType() != null && Date.class.isAssignableFrom(property.getType().getRawClass())) { TimeZone timeZone = resolveTimeZone(config.getTimeZone(), property.getMember()); replaced.add(property.withValueDeserializer(new LenientDateDeserializer(timeZone))); } } // ä¸è½è¾¹éåè¾¹æ¹ï¼å æ¶éåæ¿æ¢ for (SettableBeanProperty property : replaced) { builder.addOrReplaceProperty(property, true); } return builder; } } /** å®½æ¾æ¥æè§£æå¨ */ static class LenientDateDeserializer extends JsonDeserializer<Date> { private final TimeZone timeZone; LenientDateDeserializer(TimeZone timeZone) { this.timeZone = timeZone == null ? TimeZone.getDefault() : timeZone; } @Override public Date deserialize(JsonParser p, DeserializationContext ctxt) throws IOException { if (p.hasToken(JsonToken.VALUE_NUMBER_INT)) { return new Date(p.getLongValue()); } String text = p.getValueAsString(); if (text == null || text.trim().isEmpty()) { return null; } text = text.trim(); for (String pattern : PARSE_PATTERNS) { SimpleDateFormat format = new SimpleDateFormat(pattern); format.setLenient(false); format.setTimeZone(timeZone); ParsePosition position = new ParsePosition(0); Date parsed = format.parse(text, position); // å¿ é¡»æ´ä¸²è¢«æ¶è´¹ï¼å¦å "yyyy-MM-dd" 伿 "2026-10-08 15:23" çæ¶åéé»ä¸¢æ if (parsed != null && position.getIndex() == text.length()) { return parsed; } } try { return Date.from(Instant.parse(text)); } catch (Exception ignore) { // è½å°ä¸é¢ç»ä¸æ¥é } throw ctxt.weirdStringException(text, Date.class, "æ æ³è§£æçæ¶é´æ ¼å¼ï¼æ¯æ yyyy-MM-dd[ HH:mm[:ss]]"); } } /** 屿§ä¸æ¾å¼å£°æçæ¶åºä¼å ï¼å¦åç¨å ¨å±é ç½®ï¼å³ JVM é»è®¤æ¶åºï¼ */ private static TimeZone resolveTimeZone(TimeZone fallback, AnnotatedMember member) { if (member != null) { try { JsonFormat jsonFormat = member.getAnnotation(JsonFormat.class); if (jsonFormat != null && jsonFormat.timezone() != null && !jsonFormat.timezone().isEmpty() && !"##default".equals(jsonFormat.timezone())) { return TimeZone.getTimeZone(jsonFormat.timezone()); } } catch (Exception ignore) { // åä¸å°æ³¨è®°æ¶ç¨å ¨å±æ¶åº } } return fallback == null ? TimeZone.getDefault() : fallback; } /** è¿ç»´æ¥å¿ç±»ä¿çç§ */ private static boolean isKeepSeconds(AnnotatedMember member) { return member != null && KEEP_SECONDS_CLASSES.contains(member.getDeclaringClass().getName()); } } ruoyi-project/src/main/java/com/ruoyi/project/domain/ServiceFund.java
@@ -299,10 +299,37 @@ private Double pretaxcost; /** * ç¨åéé¢ * å¢å¼ç¨å计 */ @ApiModelProperty("ç¨åéé¢") @Excel(name = "ç¨åéé¢") @ApiModelProperty("å¢å¼ç¨å计") @Excel(name = "å¢å¼ç¨") private Double vatCost; /** * å建ç¨å计 */ @ApiModelProperty("å建ç¨å计") @Excel(name = "å建ç¨") private Double cityTaxCost; /** * å³å¡ç¨åå计 */ @ApiModelProperty("å³å¡ç¨åå计") @Excel(name = "å³å¡ç¨å") private Double laborPretaxCost; /** * ç¨å£å¾çæ¬ï¼v1=åå²å£å¾ï¼æ å¢å¼ç¨/å建ç¨ï¼ï¼v2=æ°å¢å£å¾ */ @ApiModelProperty("ç¨å£å¾çæ¬") private String taxVersion; /** * å³å¡ç¨åï¼åâç¨åéé¢âï¼ */ @ApiModelProperty("å³å¡ç¨å") @Excel(name = "å³å¡ç¨å") private Double taxedcost; /** @@ -387,10 +414,10 @@ private Long fundTaxId = null; /** * ç¨é * å³å¡ä¸ªç¨å计ï¼åâç¨éâï¼ */ @ApiModelProperty("ç¨é") @Excel(name = "ç¨é") @ApiModelProperty("å³å¡ä¸ªç¨å计") @Excel(name = "å³å¡ä¸ªç¨") private Double taxcost; @ApiModelProperty("ååè¦æ±å次åèµ·æ¶ï¼å¸¦ä¸è¿ä¸ªå¼") ruoyi-project/src/main/java/com/ruoyi/project/domain/ServiceFunddetail.java
@@ -217,11 +217,38 @@ private Double prepaidamount; /** * æ£ç¨éé¢ * å³å¡ä¸ªç¨ï¼åâæ£ç¨éé¢âï¼ */ @ApiModelProperty("æ£ç¨éé¢") @Excel(name = "æ£ç¨éé¢") @ApiModelProperty("å³å¡ä¸ªç¨") @Excel(name = "å³å¡ä¸ªç¨") private Double taxamount; /** * å¢å¼ç¨ */ @ApiModelProperty("å¢å¼ç¨") @Excel(name = "å¢å¼ç¨") private Double vatAmount; /** * åå»ºç¨ */ @ApiModelProperty("å建ç¨") @Excel(name = "å建ç¨") private Double cityTaxAmount; /** * å³å¡ç¨åéé¢ */ @ApiModelProperty("å³å¡ç¨åéé¢") @Excel(name = "å³å¡ç¨å") private Double laborPretaxAmount; /** * ç¨å£å¾çæ¬ï¼v1=åå²å£å¾ï¼æ å¢å¼ç¨/å建ç¨ï¼ï¼v2=æ°å¢å£å¾ */ @ApiModelProperty("ç¨å£å¾çæ¬") private String taxVersion; /** * åç¥¨å¼ æ° @@ -237,10 +264,10 @@ @Excel(name = "ä¸ä¼ æ¶é´") private BigDecimal reimbursementamount; /** * ç¨åéé¢ * å³å¡ç¨åï¼åâç¨åéé¢âï¼ */ @ApiModelProperty("ç¨åéé¢") @Excel(name = "ç¨åéé¢") @ApiModelProperty("å³å¡ç¨å") @Excel(name = "å³å¡ç¨å") private Double taxedamount; /** ruoyi-project/src/main/java/com/ruoyi/project/domain/ServiceFunddetailExcel.java
@@ -72,13 +72,39 @@ @Excel(name = "ç¨åéé¢") private Double amount; /** * å¢å¼ç¨ */ @ApiModelProperty("å¢å¼ç¨") @Excel(name = "å¢å¼ç¨") private Double vatAmount; /** * ç¨åéé¢ * åå»ºç¨ */ @ApiModelProperty("ç¨åéé¢") @Excel(name = "ç¨åéé¢") @ApiModelProperty("å建ç¨") @Excel(name = "å建ç¨") private Double cityTaxAmount; /** * å³å¡ç¨å */ @ApiModelProperty("å³å¡ç¨å") @Excel(name = "å³å¡ç¨å") private Double laborPretaxAmount; /** * å³å¡ä¸ªç¨ */ @ApiModelProperty("å³å¡ä¸ªç¨") @Excel(name = "å³å¡ä¸ªç¨") private Double taxamount; /** * å³å¡ç¨å */ @ApiModelProperty("å³å¡ç¨å") @Excel(name = "å³å¡ç¨å") private Double taxedamount; /** ruoyi-project/src/main/java/com/ruoyi/project/domain/ServiceFunddetailShared.java
@@ -242,20 +242,41 @@ private Double amount; /** * æ£ç¨éé¢ * å³å¡ä¸ªç¨ï¼åâæ£ç¨éé¢âï¼ */ @ApiModelProperty("æ£ç¨éé¢") @Excel(name = "æ£ç¨éé¢") @ApiModelProperty("å³å¡ä¸ªç¨") @Excel(name = "å³å¡ä¸ªç¨") private Double taxamount; /** * ç¨åéé¢ * å³å¡ç¨åï¼åâç¨åéé¢âï¼ */ @ApiModelProperty("ç¨åéé¢") @Excel(name = "ç¨åéé¢") @ApiModelProperty("å³å¡ç¨å") @Excel(name = "å³å¡ç¨å") private Double taxedamount; /** * å¢å¼ç¨ */ @ApiModelProperty("å¢å¼ç¨") @Excel(name = "å¢å¼ç¨") private Double vatAmount; /** * åå»ºç¨ */ @ApiModelProperty("å建ç¨") @Excel(name = "å建ç¨") private Double cityTaxAmount; /** * å³å¡ç¨åéé¢ */ @ApiModelProperty("å³å¡ç¨åéé¢") @Excel(name = "å³å¡ç¨å") private Double laborPretaxAmount; /** * 颿¯éé¢ */ @ApiModelProperty("颿¯éé¢") ruoyi-project/src/main/java/com/ruoyi/project/domain/ServiceFunddetailVO.java
@@ -202,11 +202,38 @@ private Double prepaidamount; /** * æ£ç¨éé¢ * å³å¡ä¸ªç¨ï¼åâæ£ç¨éé¢âï¼ */ @ApiModelProperty("æ£ç¨éé¢") @Excel(name = "æ£ç¨éé¢") @ApiModelProperty("å³å¡ä¸ªç¨") @Excel(name = "å³å¡ä¸ªç¨") private Double taxamount; /** * å¢å¼ç¨ */ @ApiModelProperty("å¢å¼ç¨") @Excel(name = "å¢å¼ç¨") private Double vatAmount; /** * åå»ºç¨ */ @ApiModelProperty("å建ç¨") @Excel(name = "å建ç¨") private Double cityTaxAmount; /** * å³å¡ç¨åéé¢ */ @ApiModelProperty("å³å¡ç¨åéé¢") @Excel(name = "å³å¡ç¨å") private Double laborPretaxAmount; /** * ç¨å£å¾çæ¬ï¼v1=åå²å£å¾ï¼æ å¢å¼ç¨/å建ç¨ï¼ï¼v2=æ°å¢å£å¾ */ @ApiModelProperty("ç¨å£å¾çæ¬") private String taxVersion; /** * åç¥¨å¼ æ° @@ -216,10 +243,10 @@ private Long invoicecount; /** * ç¨åéé¢ * å³å¡ç¨åï¼åâç¨åéé¢âï¼ */ @ApiModelProperty("ç¨åéé¢") @Excel(name = "ç¨åéé¢") @ApiModelProperty("å³å¡ç¨å") @Excel(name = "å³å¡ç¨å") private Double taxedamount; /** ruoyi-project/src/main/java/com/ruoyi/project/domain/ServiceFundtax.java
@@ -98,24 +98,51 @@ private BigDecimal pretaxamount; /** * ç¨åéé¢å计 * å¢å¼ç¨å计 */ @ApiModelProperty("ç¨åéé¢å计") @Excel(name = "ç¨åéé¢å计") @ApiModelProperty("å¢å¼ç¨å计") @Excel(name = "å¢å¼ç¨å计") private BigDecimal vatAmount; /** * å建ç¨å计 */ @ApiModelProperty("å建ç¨å计") @Excel(name = "å建ç¨å计") private BigDecimal cityTaxAmount; /** * å³å¡ç¨åå计 */ @ApiModelProperty("å³å¡ç¨åå计") @Excel(name = "å³å¡ç¨åå计") private BigDecimal laborPretaxAmount; /** * ç¨å£å¾çæ¬ï¼v1=åå²å£å¾ï¼æ å¢å¼ç¨/å建ç¨ï¼ï¼v2=æ°å¢å£å¾ */ @ApiModelProperty("ç¨å£å¾çæ¬") private String taxVersion; /** * å³å¡ç¨åï¼åâç¨åéé¢å计âï¼ */ @ApiModelProperty("å³å¡ç¨åå计") @Excel(name = "å³å¡ç¨åå计") private BigDecimal taxedamount; /** * è´¹ç¨æ»éé¢ * å³å¡ä¸ªç¨å计 */ @ApiModelProperty("è´¹ç¨æ»éé¢") @Excel(name = "è´¹ç¨æ»éé¢") @ApiModelProperty("å³å¡ä¸ªç¨å计") @Excel(name = "å³å¡ä¸ªç¨å计") private BigDecimal taxamount; /** * æ£ç¨éé¢ * å³å¡ä¸ªç¨å计ï¼åå²å段 tax_moneyï¼é¡µé¢âæ£ç¨éé¢â忤åï¼ */ @ApiModelProperty("æ£ç¨éé¢") @Excel(name = "æ£ç¨éé¢") @ApiModelProperty("å³å¡ä¸ªç¨ï¼æ£ç¨éé¢ï¼") @Excel(name = "å³å¡ä¸ªç¨") private BigDecimal taxMoney; /** ruoyi-project/src/main/java/com/ruoyi/project/domain/vo/TaxMoneySumEO.java
@@ -7,19 +7,35 @@ public class TaxMoneySumEO extends BaseEntity { /** * ç¨åæ»é¢ * ç¨åæ»é¢ï¼Amount åè®¡ï¼ */ private double amounts; /** * ç¨æ»é¢ * å¢å¼ç¨æ»é¢ */ private double vatAmounts; /** * åå»ºç¨æ»é¢ */ private double cityTaxAmounts; /** * å³å¡ç¨åæ»é¢ï¼å³å¡ä¸ªç¨ç´¯è®¡åºæ°ï¼ */ private double laborPretaxAmounts; /** * å³å¡ä¸ªç¨æ»é¢ */ private double taxAmounts; /** * ç¨åæ»é¢ * å³å¡ç¨åæ»é¢ */ private double taxedAmounts; /** * åºå· */ @@ -29,5 +45,9 @@ */ private String IDCardNo; /** * 彿已åå¨çåå²å£å¾ï¼v1ï¼æç»æ¡æ°ï¼ç¨äºé»æ¢å䏿份 v1/v2 æ··ç® */ private Long v1Count; } ruoyi-project/src/main/java/com/ruoyi/project/mapper/CasePanoramaMapper.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,28 @@ package com.ruoyi.project.mapper; import com.ruoyi.project.domain.CasePanorama; import com.ruoyi.project.domain.CasePanoramaReq; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import java.util.List; /** * æ¡ä¾å ¨æ¯Mapper * * @author ruoyi * @date 2026-10-28 */ @Mapper public interface CasePanoramaMapper { /** * æ¥è¯¢æ¡ä¾å ¨æ¯ */ List<CasePanorama> selectCasePanoramaList(@Param("req") CasePanoramaReq req); /** * æ¥è¯¢ä¸å¡ç»é项 */ List<String> selectDeptNames(); } ruoyi-project/src/main/java/com/ruoyi/project/mapper/ServiceFundtaxMapper.java
@@ -29,4 +29,13 @@ * @return */ public Integer getMaxFundTaxId(); /** * 对å½åæ¹æ¬¡æ±æ»åå è¡éï¼SELECT ... FOR UPDATEï¼ï¼é²æ¢å¹¶åéå¤ç®ç¨ã * å¿ é¡»å¨äºå¡ä¸è°ç¨ã * * @param id æ±æ»å ID * @return æ±æ»åï¼ä¸åå¨è¿å nullï¼ */ public ServiceFundtax selectByIdForUpdate(Long id); } ruoyi-project/src/main/java/com/ruoyi/project/service/ICasePanoramaService.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,25 @@ package com.ruoyi.project.service; import com.ruoyi.project.domain.CasePanorama; import com.ruoyi.project.domain.CasePanoramaReq; import java.util.List; /** * æ¡ä¾å ¨æ¯Service * * @author ruoyi * @date 2026-10-28 */ public interface ICasePanoramaService { /** * æ¥è¯¢æ¡ä¾å ¨æ¯ */ List<CasePanorama> selectCasePanoramaList(CasePanoramaReq req); /** * æ¥è¯¢ä¸å¡ç»é项 */ List<String> selectDeptNames(); } ruoyi-project/src/main/java/com/ruoyi/project/service/IServiceFunddetailService.java
@@ -1,5 +1,6 @@ package com.ruoyi.project.service; import java.util.Date; import java.util.List; import java.util.Map; @@ -62,12 +63,21 @@ List<ServiceFunddetailVO> getFundDetail(Long id); /** * æ ¹æ®æ¡ä»¶ç®ç¨ * æ ¹æ®æ¡ä»¶ç®ç¨ï¼å³å¡ä¸ªç¨ + å¢å¼ç¨ + å建ç¨ï¼ * * @param serviceFunddetails */ public Boolean calculateTax(List<ServiceFunddetail> serviceFunddetails, Map<String, TaxMoneySumEO> tempTaxSumMap); /** * æ ¹æ®æ¡ä»¶ç®ç¨ï¼å¹¶æå®æ¬æ¹ç®ç¨æ¶é´ï¼åæ¹æç» tax_time ä¸è´ï¼ * * @param serviceFunddetails æç»å表 * @param tempTaxSumMap æ¬æç´¯è®¡ç¼å * @param taxTime æ¬æ¬¡ç®ç¨æ¶é´ */ public Boolean calculateTax(List<ServiceFunddetail> serviceFunddetails, Map<String, TaxMoneySumEO> tempTaxSumMap, Date taxTime); // public Boolean calculateTax2(List<ServiceFunddetail> serviceFunddetails); /** ruoyi-project/src/main/java/com/ruoyi/project/service/impl/ServiceFundServiceImpl.java
@@ -1705,10 +1705,23 @@ //éè¿åç人åç§°ï¼å°ç¨åãç¨åçå¼ç¸å Map<String, Double> sumAmount = serviceFunddetails.stream().collect(Collectors.groupingBy(ServiceFunddetail::getBeneficiaryname, Collectors.summingDouble(ServiceFunddetail::getAmount))); Map<String, Double> sumTaxdAmount = serviceFunddetails.stream().collect(Collectors.groupingBy(ServiceFunddetail::getBeneficiaryname, Collectors.summingDouble(ServiceFunddetail::getTaxedamount))); // æ°å¢å£å¾ï¼å¢å¼ç¨ãå建ç¨ãå³å¡ç¨åãå³å¡ä¸ªç¨æåç人å计 Map<String, Double> sumVat = serviceFunddetails.stream().collect(Collectors.groupingBy(ServiceFunddetail::getBeneficiaryname, Collectors.summingDouble(d -> d.getVatAmount() == null ? 0.0 : d.getVatAmount()))); Map<String, Double> sumCityTax = serviceFunddetails.stream().collect(Collectors.groupingBy(ServiceFunddetail::getBeneficiaryname, Collectors.summingDouble(d -> d.getCityTaxAmount() == null ? 0.0 : d.getCityTaxAmount()))); Map<String, Double> sumLaborPretax = serviceFunddetails.stream().collect(Collectors.groupingBy(ServiceFunddetail::getBeneficiaryname, Collectors.summingDouble(d -> d.getLaborPretaxAmount() == null ? 0.0 : d.getLaborPretaxAmount()))); Map<String, Double> sumTax = serviceFunddetails.stream().collect(Collectors.groupingBy(ServiceFunddetail::getBeneficiaryname, Collectors.summingDouble(d -> d.getTaxamount() == null ? 0.0 : d.getTaxamount()))); for (String key : sumAmount.keySet()) { ServiceFunddetailExcel serviceFunddetailExcel = new ServiceFunddetailExcel(); serviceFunddetailExcel.setAmount(sumAmount.getOrDefault(key, 0.0)); serviceFunddetailExcel.setVatAmount(sumVat.getOrDefault(key, 0.0)); serviceFunddetailExcel.setCityTaxAmount(sumCityTax.getOrDefault(key, 0.0)); serviceFunddetailExcel.setLaborPretaxAmount(sumLaborPretax.getOrDefault(key, 0.0)); serviceFunddetailExcel.setTaxamount(sumTax.getOrDefault(key, 0.0)); serviceFunddetailExcel.setTaxedamount(sumTaxdAmount.getOrDefault(key, 0.0)); for (ServiceFunddetail serviceFunddetail2 : serviceFunddetails) { if (serviceFunddetail2.getBeneficiaryname().equals(key)) { ruoyi-project/src/main/java/com/ruoyi/project/service/impl/ServiceFunddetailServiceImpl.java
@@ -13,6 +13,7 @@ import com.ruoyi.common.exception.base.BaseException; import com.ruoyi.common.tax.PerformanceTaxtUtils; import com.ruoyi.common.tax.TaxtUtils; import com.ruoyi.common.tax.VatTaxUtils; import com.ruoyi.common.utils.bean.DtoConversionUtils; import com.ruoyi.project.domain.*; import com.ruoyi.project.domain.vo.*; @@ -253,15 +254,22 @@ Long fundid = serviceFunddetail.getFundid(); ServiceFund serviceFund = serviceFundMapper.selectById(fundid); if (ObjectUtils.isNotEmpty(serviceFund)) { Double pretax = serviceFund.getPretaxcost(); Double aftertax = serviceFund.getTaxedcost(); pretax = pretax - serviceFunddetail.getAmount(); aftertax = aftertax - serviceFunddetail.getTaxedamount(); Double amount = pretax + aftertax; // éé¢ä¸å¾ç¨ BigDecimal ç´¯å /æ£åï¼é¿å æµ®ç¹å°¾å·® BigDecimal pretax = toMoney(serviceFund.getPretaxcost()).subtract(toMoney(serviceFunddetail.getAmount())); BigDecimal aftertax = toMoney(serviceFund.getTaxedcost()).subtract(toMoney(serviceFunddetail.getTaxedamount())); BigDecimal vat = toMoney(serviceFund.getVatCost()).subtract(toMoney(serviceFunddetail.getVatAmount())); BigDecimal cityTax = toMoney(serviceFund.getCityTaxCost()).subtract(toMoney(serviceFunddetail.getCityTaxAmount())); BigDecimal laborPretax = toMoney(serviceFund.getLaborPretaxCost()).subtract(toMoney(serviceFunddetail.getLaborPretaxAmount())); BigDecimal tax = toMoney(serviceFund.getTaxcost()).subtract(toMoney(serviceFunddetail.getTaxamount())); BigDecimal amount = pretax.add(aftertax); serviceFund.setPretaxcost(pretax); serviceFund.setTaxedcost(aftertax); serviceFund.setAmountrequested(amount); serviceFund.setPretaxcost(pretax.doubleValue()); serviceFund.setTaxedcost(aftertax.doubleValue()); serviceFund.setVatCost(vat.doubleValue()); serviceFund.setCityTaxCost(cityTax.doubleValue()); serviceFund.setLaborPretaxCost(laborPretax.doubleValue()); serviceFund.setTaxcost(tax.doubleValue()); serviceFund.setAmountrequested(amount.doubleValue()); int updateAmount = serviceFundMapper.updateById(serviceFund); } return serviceFunddetailMapper.deleteById(id); @@ -285,145 +293,228 @@ } /** * æ¹éç®ç¨ä¸»æ¹æ³ * 1. æ ¡éªåæ° * 2. æåºæç»ï¼ä¿è¯ç¨æ¶é´ä¸ºç©ºçæå¨åé¢ * 3. éåæ¯æ¡æç»ï¼å身份è¯å·ä¸ºç©ºåä¸ä¸ºç©ºä¸¤ç§æ åµåå«å¤ç * - 身份è¯å·ä¸ºç©ºï¼ç´æ¥æè§åèµå¼ç¨åéé¢ãç¨é * - 身份è¯å·ä¸ä¸ºç©ºï¼ * a. æ¥è¯¢æ¬æç¬¬ä¸å¤©ï¼è·åæå¤§åºå· * b. æ¥è¯¢æ¬æç´¯è®¡ç¨åãç¨éãç¨åéé¢ * c. æ ¹æ®"ç¨å/ç¨å"ç±»ååå«è®¡ç®ç¨éãç¨åéé¢ * d. 设置ç®ç¨æ¶é´ãåºå·ç * 4. ç´¯è®¡æ¬æ¹æ¬¡æ»ç¨åãç¨åéé¢ * 5. æ¹éæ´æ°æææç» * 6. æ´æ°ä¸»è¡¨ServiceFundçæ»éé¢ãç®ç¨æ¶é´ãç¶æ * æ¹éç®ç¨ä¸»æ¹æ³ï¼å³å¡ä¸ªç¨ + å¢å¼ç¨ + å建ç¨ï¼v2 å£å¾ï¼ * <p> * é颿¨¡åï¼ * <pre> * ç¨åå½å ¥ï¼V = ceil(P à 1%)ãC = ceil(V à 3.5%)ãL = P - V - Cã * T = å³å¡ä¸ªç¨(å½æç´¯è®¡ L) - å累计 TãN = L - T * ç¨åå½å ¥ï¼N累计 = å累计 N + NãL累计 = getTaxationBefore(N累计)ã * L = L累计 - å累计 LãT = L - NãP/V/C = solveGross(L) * æ 身份è¯ï¼V = C = T = 0ï¼L = N = P * </pre> * * @param serviceFunddetails è´¹ç¨æç»å表 * @param tempTaxSumMap æ¬æç´¯è®¡éé¢ç¼åï¼æèº«ä»½è¯å·ï¼ * @return æ¯å¦ç®ç¨æå */ @Override public Boolean calculateTax(List<ServiceFunddetail> serviceFunddetails, Map<String, TaxMoneySumEO> tempTaxSumMap) { return calculateTax(serviceFunddetails, tempTaxSumMap, new Date()); } /** * æ¹éç®ç¨ï¼æå®æ¬æ¹ç®ç¨æ¶é´ï¼ä¿è¯åæ¹æç» tax_time ä¸è´ï¼ * * @param serviceFunddetails è´¹ç¨æç»å表 * @param tempTaxSumMap æ¬æç´¯è®¡éé¢ç¼åï¼æèº«ä»½è¯å·ï¼ * @param taxTime æ¬æ¬¡ç®ç¨æ¶é´ * @return æ¯å¦ç®ç¨æå */ @Override public Boolean calculateTax(List<ServiceFunddetail> serviceFunddetails, Map<String, TaxMoneySumEO> tempTaxSumMap, Date taxTime) { // 1. æ ¡éªåæ° if (CollectionUtils.isEmpty(serviceFunddetails)) { throw new BaseException("ç®ç¨æ¡ä»¶ä¸ºç©ºï¼è¯·æ£æ¥åï¼åè¿è¡è®¡ç®"); } // 2. æåºï¼ç¨æ¶é´ä¸ºç©ºçæåé¢ serviceFunddetails.sort(Comparator.comparing(obj -> ObjectUtils.isEmpty(obj.getTaxTime()) ? 1 : 0)); // 2. æåºï¼ç¨æ¶é´ä¸ºç©ºçæåé¢ï¼åæ id ä¿è¯åæ¹é¡ºåºç¨³å® serviceFunddetails.sort(Comparator .comparing((ServiceFunddetail obj) -> ObjectUtils.isEmpty(obj.getTaxTime()) ? 1 : 0) .thenComparing(obj -> obj.getId() == null ? Long.MAX_VALUE : obj.getId())); // 3. è·åæ¬æ¹æ¬¡fundidåä¸»è¡¨ä¿¡æ¯ // 3. è·åæ¬æ¹æ¬¡ fundid åä¸»è¡¨ä¿¡æ¯ Long fundid = serviceFunddetails.get(0).getFundid(); log.info("ç®ç¨çfundidçå¼ä¸ºï¼{}", fundid); ServiceFund serviceFund1 = serviceFundMapper.selectById(fundid); log.info("fund表çfundtextimeå¼ä¸ºï¼{}", serviceFund1.getFundtaxtime()); // 4. åå§å累计éé¢ãå¾ æ´æ°æç»å表ãåºå·ç¼åã累计éé¢ç¼å BigDecimal pretaxcost = BigDecimal.ZERO; BigDecimal taxedcost = BigDecimal.ZERO; if (serviceFund1 == null) { throw new BaseException("æªæ¾å°è´¹ç¨ç³è¯·åï¼ID=" + fundid); } // æç» tax_time ç»ä¸ä½¿ç¨æ¬æ¬¡ç®ç¨æ¶é´ if (taxTime == null) { taxTime = new Date(); } //å建ä¸ä¸ªç¨äºåæ¾âéè¦æ´æ°å°æ°æ®åºçServiceFunddetail对象âçå表 // 4. æ¬æ¹æ¬¡å计ï¼å ¨é¨ç¨ BigDecimalï¼ç¦æ¢ double ç´¯å ï¼ BigDecimal pretaxTotal = BigDecimal.ZERO; BigDecimal vatTotal = BigDecimal.ZERO; BigDecimal cityTaxTotal = BigDecimal.ZERO; BigDecimal laborPretaxTotal = BigDecimal.ZERO; BigDecimal taxTotal = BigDecimal.ZERO; BigDecimal taxedTotal = BigDecimal.ZERO; List<ServiceFunddetail> updateList = new ArrayList<>(); // 5. éåæ¯æ¡æç»ï¼åæ åµå¤ç // 5. éåæ¯æ¡æç» for (ServiceFunddetail detail : serviceFunddetails) { // 5.1 身份è¯å·ä¸ºç©ºï¼ç´æ¥èµå¼ï¼ä¸äºäººæå ¬å¸ï¼ä¸éè¦ç®ç¨ï¼ if (detail.getAmount() == null) { detail.setAmount(0.0); } if (detail.getTaxedamount() == null) { detail.setTaxedamount(0.0); } // æå¡è¯´æä¸ºç©ºæâéç¨åâå¤ç String scopeName = detail.getServicesscopename() == null ? "" : detail.getServicesscopename().trim(); boolean afterTax = scopeName.contains("ç¨å"); // 5.1 身份è¯å·ä¸ºç©ºï¼ä¸æ£å¢å¼ç¨/å建ç¨/å³å¡ä¸ªç¨ if (StringUtils.isEmpty(detail.getIdcardno())) { if (StringUtils.isEmpty(detail.getServicesscopename()) || !detail.getServicesscopename().contains("ç¨å")) { // æ®éæç»ï¼ç¨åéé¢=ç³è¯·éé¢ detail.setTaxedamount(detail.getAmount()); } else { // ç¨åæç»ï¼ç³è¯·éé¢=ç¨åéé¢ detail.setAmount(detail.getTaxedamount()); } // ç´¯è®¡æ¬æ¹æ¬¡æ»éé¢ pretaxcost = pretaxcost.add(BigDecimal.valueOf(detail.getAmount())); taxedcost = taxedcost.add(BigDecimal.valueOf(detail.getTaxedamount())); BigDecimal p = afterTax ? toMoney(detail.getTaxedamount()) : toMoney(detail.getAmount()); detail.setAmount(p.doubleValue()); detail.setVatAmount(0.0); detail.setCityTaxAmount(0.0); detail.setLaborPretaxAmount(p.doubleValue()); detail.setTaxamount(0.0); detail.setTaxedamount(p.doubleValue()); detail.setTaxVersion(VatTaxUtils.TAX_VERSION_V2); detail.setTaxTime(taxTime); updateList.add(detail); pretaxTotal = pretaxTotal.add(p); laborPretaxTotal = laborPretaxTotal.add(p); taxedTotal = taxedTotal.add(p); continue; } // 5.2 身份è¯å·ä¸ä¸ºç©ºï¼éæ¥åå²ç´¯è®¡éé¢ãåºå· // 5.2 身份è¯å·ä¸ä¸ºç©ºï¼æ¬æç´¯è®¡ + åæ¡£ç®ç¨ String idcard = detail.getIdcardno().trim(); // 5.2.1 æ¥è¯¢æ¬æç´¯è®¡éé¢ï¼ç¼åé¿å é夿¥åºï¼ TaxMoneySumEO taxSum = tempTaxSumMap.getOrDefault(idcard, null); // 5.2.1 忬æç´¯è®¡ï¼ç¼åé¿å é夿¥åºï¼ TaxMoneySumEO taxSum = tempTaxSumMap.get(idcard); if (taxSum == null) { taxSum = new TaxMoneySumEO(); taxSum.setXh(1L); detail.setXh(1L); taxSum.setXh(0L); tempTaxSumMap.put(idcard, taxSum); detail.setAllAmount(taxSum.getAmounts()); } long xh = (taxSum.getXh() == null ? 0L : taxSum.getXh()) + 1; taxSum.setXh(xh); detail.setXh(xh); // 累计ç¨åéé¢ï¼ä¸å«æ¬ç¬ï¼ï¼ç¨äºé¡µé¢å±ç¤º detail.setAllAmount(taxSum.getAmounts()); BigDecimal prevAmount = toMoney(taxSum.getAmounts()); BigDecimal prevLaborPretax = toMoney(taxSum.getLaborPretaxAmounts()); BigDecimal prevTax = toMoney(taxSum.getTaxAmounts()); BigDecimal prevTaxed = toMoney(taxSum.getTaxedAmounts()); BigDecimal prevVat = toMoney(taxSum.getVatAmounts()); BigDecimal prevCityTax = toMoney(taxSum.getCityTaxAmounts()); BigDecimal pretax; BigDecimal vat; BigDecimal cityTax; BigDecimal laborPretax; BigDecimal taxAmount; BigDecimal taxedAmount; if (afterTax) { // 5.2.2 ç¨åå½å ¥ï¼å åç®å³å¡ç¨åï¼å循ç¯åè§£ç¨å/å¢å¼ç¨/åå»ºç¨ taxedAmount = toMoney(detail.getTaxedamount()); BigDecimal sumTaxed = prevTaxed.add(taxedAmount); BigDecimal sumLaborPretax = new BigDecimal(TaxtUtils.getTaxationBefore(sumTaxed)); laborPretax = VatTaxUtils.roundMoney(sumLaborPretax.subtract(prevLaborPretax)); if (laborPretax.signum() < 0) { // éç¬åä¸åæ´å¯è½å¸¦æ¥å åé±çåç®è¯¯å·®ï¼å®¹å·®å æ 0 å¤çï¼è¶ åºå®¹å·®è¯´ææ°æ®å¼å¸¸ if (laborPretax.abs().compareTo(new BigDecimal("0.05")) <= 0) { log.warn("ç¨åéé¢åç®å³å¡ç¨ååºç°è´å°¾å·®ï¼å·²æ 0 å¤çã人åï¼{}ï¼åç®å³å¡ç¨å={}ï¼å累计å³å¡ç¨å={}", safeName(detail), sumLaborPretax, prevLaborPretax); laborPretax = BigDecimal.ZERO; } else { throw new BaseException("ç¨åéé¢åç®å³å¡ç¨å失败ï¼äººåï¼" + safeName(detail)); } } taxAmount = VatTaxUtils.roundMoney(laborPretax.subtract(taxedAmount)); if (taxAmount.signum() < 0) { taxAmount = BigDecimal.ZERO; } VatTaxUtils.GrossAmount gross = VatTaxUtils.solveGross(laborPretax); pretax = gross.getPretax(); vat = gross.getVat(); cityTax = gross.getCityTax(); } else { long xh = taxSum.getXh() + 1; taxSum.setXh(xh); tempTaxSumMap.put(idcard, taxSum); detail.setXh(xh); detail.setAllAmount(taxSum.getAmounts()); // 5.2.3 ç¨åå½å ¥ï¼å ç®å¢å¼ç¨/å建ç¨/å³å¡ç¨åï¼åæç´¯è®¡å³å¡ç¨åç®å³å¡ä¸ªç¨ pretax = toMoney(detail.getAmount()); vat = VatTaxUtils.calcVat(pretax); cityTax = VatTaxUtils.calcCityTax(vat); laborPretax = VatTaxUtils.roundMoney(pretax.subtract(vat).subtract(cityTax)); BigDecimal sumLaborPretax = prevLaborPretax.add(laborPretax); BigDecimal sumTax = new BigDecimal(TaxtUtils.getTaxation(sumLaborPretax)); taxAmount = VatTaxUtils.roundMoney(sumTax.subtract(prevTax)); if (taxAmount.signum() < 0) { taxAmount = BigDecimal.ZERO; } taxedAmount = VatTaxUtils.roundMoney(laborPretax.subtract(taxAmount)); } // 5.2.3 ç®ç¨é»è¾ if (detail.getServicesscopename().contains("ç¨å")) { // ç¨åæç»ï¼ç´¯è®¡ç¨åéé¢ï¼åæ¨ç¨åéé¢åç¨é // if (idcard.equals("362329199103224511")) { // log.info("æ±ç®å®"); // } BigDecimal newTaxedAmounts = BigDecimal.valueOf(taxSum.getTaxedAmounts()).add(BigDecimal.valueOf(detail.getTaxedamount())); String taxationBefore = TaxtUtils.getTaxationBefore(newTaxedAmounts); BigDecimal amountNow = new BigDecimal(taxationBefore).subtract(BigDecimal.valueOf(taxSum.getAmounts())); BigDecimal tax = amountNow.subtract(BigDecimal.valueOf(detail.getTaxedamount())); detail.setAmount(amountNow.doubleValue()); detail.setTaxamount(tax.doubleValue()); if (ObjectUtils.isEmpty(serviceFund1.getFundtaxtime())) { detail.setTaxTime(new Date()); } else { detail.setTaxTime(serviceFund1.getFundtaxtime()); } taxSum.setAmounts((BigDecimal.valueOf(taxSum.getAmounts()).add(amountNow)).doubleValue()); taxSum.setTaxAmounts((BigDecimal.valueOf(taxSum.getTaxAmounts()).add(tax)).doubleValue()); taxSum.setTaxedAmounts(newTaxedAmounts.doubleValue()); } else { // ç¨åæç»ï¼ç´¯è®¡ç¨åéé¢ï¼ç®æ»ç¨éï¼åç®æ¬æ¬¡ç¨éåç¨åéé¢ BigDecimal newAmounts = BigDecimal.valueOf(taxSum.getAmounts()).add(BigDecimal.valueOf(detail.getAmount())); // if (idcard.equals("362329199103224511")) { // log.info("æ±ç®å®"); // } String taxation = TaxtUtils.getTaxation(newAmounts); BigDecimal taxAmountNow = new BigDecimal(taxation).subtract(new BigDecimal(String.valueOf(taxSum.getTaxAmounts()))); BigDecimal texdAfterNow = BigDecimal.valueOf(detail.getAmount()).subtract(taxAmountNow); detail.setTaxamount(taxAmountNow.doubleValue()); detail.setTaxedamount(texdAfterNow.doubleValue()); if (ObjectUtils.isEmpty(serviceFund1.getFundtaxtime())) { detail.setTaxTime(new Date()); } else { detail.setTaxTime(serviceFund1.getFundtaxtime()); } taxSum.setAmounts(newAmounts.doubleValue()); taxSum.setTaxAmounts((BigDecimal.valueOf(taxSum.getTaxAmounts()).add(taxAmountNow).doubleValue())); taxSum.setTaxedAmounts((BigDecimal.valueOf(taxSum.getTaxedAmounts()).add(texdAfterNow)).doubleValue()); } detail.setAmount(pretax.doubleValue()); detail.setVatAmount(vat.doubleValue()); detail.setCityTaxAmount(cityTax.doubleValue()); detail.setLaborPretaxAmount(laborPretax.doubleValue()); detail.setTaxamount(taxAmount.doubleValue()); detail.setTaxedamount(taxedAmount.doubleValue()); detail.setTaxVersion(VatTaxUtils.TAX_VERSION_V2); detail.setTaxTime(taxTime); updateList.add(detail); pretaxcost = pretaxcost.add(BigDecimal.valueOf(detail.getAmount())); taxedcost = taxedcost.add(BigDecimal.valueOf(detail.getTaxedamount())); // 5.2.4 æ´æ°æ¬æç´¯è®¡ taxSum.setAmounts(prevAmount.add(pretax).doubleValue()); taxSum.setVatAmounts(prevVat.add(vat).doubleValue()); taxSum.setCityTaxAmounts(prevCityTax.add(cityTax).doubleValue()); taxSum.setLaborPretaxAmounts(prevLaborPretax.add(laborPretax).doubleValue()); taxSum.setTaxAmounts(prevTax.add(taxAmount).doubleValue()); taxSum.setTaxedAmounts(prevTaxed.add(taxedAmount).doubleValue()); pretaxTotal = pretaxTotal.add(pretax); vatTotal = vatTotal.add(vat); cityTaxTotal = cityTaxTotal.add(cityTax); laborPretaxTotal = laborPretaxTotal.add(laborPretax); taxTotal = taxTotal.add(taxAmount); taxedTotal = taxedTotal.add(taxedAmount); } // 6. æ¹éæ´æ°æææç» for (ServiceFunddetail d : updateList) { this.updateById(d); } // 7. æ´æ°ä¸»è¡¨ServiceFund ServiceFund serviceFund = new ServiceFund(); serviceFund.setPretaxcost(pretaxcost.doubleValue()); serviceFund.setTaxedcost(taxedcost.doubleValue()); serviceFund.setId(serviceFunddetails.get(0).getFundid()); serviceFund.setFundtaxtime(new Date()); // 7. æ´æ°ä¸»è¡¨ service_fund ç 6 个éé¢ãç®ç¨æ¶é´ãç¶æãçæ¬ ServiceFund serviceFund = new ServiceFund(); serviceFund.setId(fundid); serviceFund.setPretaxcost(pretaxTotal.doubleValue()); serviceFund.setVatCost(vatTotal.doubleValue()); serviceFund.setCityTaxCost(cityTaxTotal.doubleValue()); serviceFund.setLaborPretaxCost(laborPretaxTotal.doubleValue()); serviceFund.setTaxcost(taxTotal.doubleValue()); serviceFund.setTaxedcost(taxedTotal.doubleValue()); serviceFund.setTaxVersion(VatTaxUtils.TAX_VERSION_V2); serviceFund.setFundtaxtime(taxTime); serviceFund.setIstax(1); serviceFundMapper.updateById(serviceFund); return true; } /** * null å®å ¨çéé¢è½¬æ¢ */ private static BigDecimal toMoney(Double value) { return value == null ? BigDecimal.ZERO : BigDecimal.valueOf(value); } /** * æ¥éæ¶è½å®ä½å°å ·ä½äººå */ private static String safeName(ServiceFunddetail detail) { String name = detail.getBeneficiaryname() == null ? "" : detail.getBeneficiaryname(); String idcard = detail.getIdcardno() == null ? "" : detail.getIdcardno(); return name + "(" + idcard + ")"; } // @Override @@ -493,6 +584,10 @@ //å°è®¡ç®åºæ¥çæ°æ®æ¾å°serviceFunddetailä¸ serviceFunddetail.setTaxamount(nowSingleTax.doubleValue()); serviceFunddetail.setTaxedamount(taxAfter.doubleValue()); // 绩æä¸å±äºä¸å®¶è´¹ï¼ä¸è®¡ç®å¢å¼ç¨/å建ç¨ï¼å³å¡ç¨å = ç¨åéé¢ serviceFunddetail.setVatAmount(0.0); serviceFunddetail.setCityTaxAmount(0.0); serviceFunddetail.setLaborPretaxAmount(serviceFunddetail.getAmount()); serviceFunddetail.setJxrq(nowMonth); save(serviceFunddetail); ruoyi-project/src/main/java/com/ruoyi/project/service/impl/ServiceFundtaxServiceImpl.java
@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.common.exception.base.BaseException; import com.ruoyi.common.tax.VatTaxUtils; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.project.domain.ServiceFund; import com.ruoyi.project.domain.ServiceFunddetail; @@ -23,6 +24,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; import java.time.LocalDate; import java.time.ZoneId; import java.time.temporal.TemporalAdjusters; @@ -171,66 +173,128 @@ /** * æ¹éç®ç¨ä¸»å ¥å£ * 1. æ ¡éªåæ° * 2. æ ¡éªæ¹æ¬¡åæ³æ§ï¼å¦æå¿ è¦ï¼ * 3. æ¥è¯¢æ¬æ¹æ¬¡ææServiceFundï¼æidååºï¼ * 4. 颿¥è¯¢æ¬æææèº«ä»½è¯å·ç累计éé¢ï¼ç¼åå°Mapï¼æååç»ç®ç¨æç * 5. éåæ¯ä¸ªServiceFundï¼æ¹éç®ç¨ * 2. åªå è®¸ææ°æ¹æ¬¡ç®ç¨ * 3. 对å½åæ¹æ¬¡ service_fundtax å è¡éï¼é²å¹¶åéå¤ç®ç¨ * 4. æ¥è¯¢æ¬æ¹æ¬¡ææ ServiceFundï¼æ id ååºï¼ï¼å¹¶éç½® istax * 5. 颿¥è¯¢æ¬æææèº«ä»½è¯å·ç累计éé¢ï¼ç¼åå° Map * 6. æ ¡éªå½ææ¯å¦åå¨åå²å£å¾ï¼v1ï¼ç®ç¨è®°å½ï¼é²æ¢æ°æ§å£å¾æ··ç® * 7. éåæ¯ä¸ª ServiceFund éåç®ç¨ï¼æ±æ»ååå service_fundtax * <p> * æ´æ¹å¨ä¸ä¸ªäºå¡å 宿ï¼ä»»ä¸æ¡å¤±è´¥åæ´æ¹åæ»ï¼ä¸ä¼åºç°åæ¹æ°æ®ã * * @param fundTaxVO æ¹æ¬¡ç®ç¨åæ° * @return æ¯å¦ç®ç¨æå */ @Override @Transactional(rollbackFor = Exception.class) public Boolean batchFundTax(FundTaxVO fundTaxVO) { log.info("æ¹éç®ç¨çfundTaxVOå ¥å为ï¼{}", fundTaxVO); // 1. æ ¡éªåæ° if (fundTaxVO.getFundTaxId() == null) { throw new BaseException("åæ¹ç®ç¨åºé®é¢äº,è¯·æ£æ¥ååè¿è¡è®¡ç®"); } // 2. æ ¡éªæ¹æ¬¡åæ³æ§ï¼ä» éä¿®æ¹æä½ï¼ // 2. åªå è®¸ææ°æ¹æ¬¡ç®ç¨ if (fundTaxVO.getAddOrupdate() == 1) { Integer maxFundTaxId = serviceFundtaxMapper.getMaxFundTaxId(); log.info("æ¹éç®ç¨çmaxFundTaxId为ï¼{}", maxFundTaxId); if (!fundTaxVO.getFundTaxId().equals(Long.valueOf(maxFundTaxId))) { if (maxFundTaxId == null || !fundTaxVO.getFundTaxId().equals(Long.valueOf(maxFundTaxId))) { throw new BaseException("è¯¥æ¹æ°æ®ä¸è½ç®ç¨"); } } // 3. æ¥è¯¢æ¬æ¹æ¬¡ææServiceFundï¼æidååºï¼ // 3. 对å½åæ¹æ¬¡æ±æ»åå è¡éï¼äºå¡å ææï¼ï¼é²æ¢å¹¶åéå¤ç®ç¨ ServiceFundtax fundtax = serviceFundtaxMapper.selectByIdForUpdate(fundTaxVO.getFundTaxId()); if (fundtax == null) { throw new BaseException("æªæ¾å°ç®ç¨æ±æ»åï¼ID=" + fundTaxVO.getFundTaxId()); } // 4. æ¥è¯¢æ¬æ¹æ¬¡ææ ServiceFundï¼æ id ååºï¼ ServiceFund serviceFund = new ServiceFund(); serviceFund.setFundTaxId(fundTaxVO.getFundTaxId()); serviceFund.setDel_flag(0); List<ServiceFund> serviceFunds = serviceFundService.selectServiceFundList(serviceFund); for (ServiceFund serviceFund1 : serviceFunds) { serviceFundMapper.updateFundIsTexById(serviceFund1.getId(), 0L); } // æidååºæåºï¼ä¿è¯å¤ç顺åºä¸è´ serviceFunds.sort(Comparator.comparing(ServiceFund::getId)); if (CollectionUtils.isEmpty(serviceFunds)) { log.warn("æªæ¥è¯¢å°ç¸å ³ServiceFundï¼fundTaxId={}", fundTaxVO.getFundTaxId()); return false; } // éç½®æ¬æ¹ istax ä¸ç®ç¨æ¶é´ï¼ä½¿æ¬æç´¯è®¡æ¥è¯¢ä¸ä¼éå¤è®¡å ¥æ¬æ¹ for (ServiceFund serviceFund1 : serviceFunds) { serviceFundMapper.updateFundIsTexById(serviceFund1.getId(), 0L); } // æ id ååºæåºï¼ä¿è¯å¤ç顺åºä¸è´ serviceFunds.sort(Comparator.comparing(ServiceFund::getId)); // 4. 颿¥è¯¢æ¬æææèº«ä»½è¯å·ç累计éé¢ï¼ç¼åå°Mapï¼æååç»ç®ç¨æç TaxMoneyByItemEO taxMoneyVO = new TaxMoneyByItemEO(); // 5. 颿¥è¯¢æ¬æææèº«ä»½è¯å·ç累计éé¢ï¼ç¼åå° Mapï¼æååç»ç®ç¨æç Date taxTime = new Date(); Date firstDay = Date.from(LocalDate.now().with(TemporalAdjusters.firstDayOfMonth()).atStartOfDay(ZoneId.systemDefault()).toInstant()); TaxMoneyByItemEO taxMoneyVO = new TaxMoneyByItemEO(); taxMoneyVO.setFirstDay(firstDay); taxMoneyVO.setTaxTime(new Date()); taxMoneyVO.setTaxTime(taxTime); Map<String, TaxMoneySumEO> tempTaxSumMap = new HashMap<>(); List<TaxMoneySumEO> taxSum = serviceFunddetailMapper.getTaxSum(taxMoneyVO); for (TaxMoneySumEO taxMoneySumEO : taxSum) { tempTaxSumMap.put(taxMoneySumEO.getIDCardNo(), taxMoneySumEO); if (CollectionUtils.isNotEmpty(taxSum)) { for (TaxMoneySumEO taxMoneySumEO : taxSum) { tempTaxSumMap.put(taxMoneySumEO.getIDCardNo(), taxMoneySumEO); // 6. 彿已åå¨çåå²å£å¾ï¼v1ï¼è®°å½ä¼è®©ç´¯è®¡åºæ°æ°æ§æ··ç®ï¼ç´æ¥é»æ¢ if (taxMoneySumEO.getV1Count() != null && taxMoneySumEO.getV1Count() > 0) { throw new BaseException("彿已å卿§å£å¾ï¼v1ï¼ç®ç¨è®°å½ï¼ä¸ºé¿å æ°æ§å£å¾æ··ç®ï¼" + "æ¬æè¯·ç»§ç»ä½¿ç¨æ§å£å¾æä»ä¸ä¸ªæèµ·åææ°å£å¾ç®ç¨ã人å身份è¯å·ï¼" + taxMoneySumEO.getIDCardNo()); } } } // 5. éåæ¯ä¸ªServiceFundï¼æ¹éç®ç¨ // 7. éåæ¯ä¸ª ServiceFundï¼éåç®ç¨å¹¶æ±æ» BigDecimal pretaxTotal = BigDecimal.ZERO; BigDecimal vatTotal = BigDecimal.ZERO; BigDecimal cityTaxTotal = BigDecimal.ZERO; BigDecimal laborPretaxTotal = BigDecimal.ZERO; BigDecimal taxTotal = BigDecimal.ZERO; BigDecimal taxedTotal = BigDecimal.ZERO; for (ServiceFund serviceFund1 : serviceFunds) { ServiceFunddetail serviceFunddetail = new ServiceFunddetail(); serviceFunddetail.setFundid(serviceFund1.getId()); List<ServiceFunddetail> serviceFunddetails = serviceFunddetailMapper.selectServiceFunddetailList(serviceFunddetail); // ä¼ å ¥ç´¯è®¡éé¢ç¼åï¼æåç®ç¨æç serviceFunddetailService.calculateTax(serviceFunddetails, tempTaxSumMap); if (CollectionUtils.isEmpty(serviceFunddetails)) { throw new BaseException("åæ®æ²¡æå¯ç®ç¨çæç»ï¼åæ®ID=" + serviceFund1.getId() + "ï¼æç®æ¡ä¾=" + serviceFund1.getDonorname()); } // ä¼ å ¥ç´¯è®¡éé¢ç¼åä¸ç»ä¸ç®ç¨æ¶é´ serviceFunddetailService.calculateTax(serviceFunddetails, tempTaxSumMap, taxTime); for (ServiceFunddetail detail : serviceFunddetails) { pretaxTotal = pretaxTotal.add(toMoney(detail.getAmount())); vatTotal = vatTotal.add(toMoney(detail.getVatAmount())); cityTaxTotal = cityTaxTotal.add(toMoney(detail.getCityTaxAmount())); laborPretaxTotal = laborPretaxTotal.add(toMoney(detail.getLaborPretaxAmount())); taxTotal = taxTotal.add(toMoney(detail.getTaxamount())); taxedTotal = taxedTotal.add(toMoney(detail.getTaxedamount())); } } // 8. ååæ±æ»å service_fundtaxï¼6 个éé¢ + ç®ç¨ç¶æ + çæ¬ï¼ ServiceFundtax updateFundtax = new ServiceFundtax(); updateFundtax.setId(fundTaxVO.getFundTaxId()); updateFundtax.setPretaxamount(VatTaxUtils.roundMoney(pretaxTotal)); updateFundtax.setVatAmount(VatTaxUtils.roundMoney(vatTotal)); updateFundtax.setCityTaxAmount(VatTaxUtils.roundMoney(cityTaxTotal)); updateFundtax.setLaborPretaxAmount(VatTaxUtils.roundMoney(laborPretaxTotal)); updateFundtax.setTaxamount(VatTaxUtils.roundMoney(taxTotal)); updateFundtax.setTaxMoney(VatTaxUtils.roundMoney(taxTotal)); updateFundtax.setTaxedamount(VatTaxUtils.roundMoney(taxedTotal)); updateFundtax.setTaxVersion(VatTaxUtils.TAX_VERSION_V2); updateFundtax.setIstax(1); updateFundtax.setTaxedtime(taxTime); serviceFundtaxMapper.updateById(updateFundtax); log.info("æ¹éç®ç¨å®æï¼fundTaxId={}ï¼ç¨å={}ï¼å¢å¼ç¨={}ï¼å建ç¨={}ï¼å³å¡ç¨å={}ï¼å³å¡ä¸ªç¨={}ï¼å³å¡ç¨å={}", fundTaxVO.getFundTaxId(), pretaxTotal, vatTotal, cityTaxTotal, laborPretaxTotal, taxTotal, taxedTotal); return true; } /** * null å®å ¨çéé¢è½¬æ¢ */ private static BigDecimal toMoney(Double value) { return value == null ? BigDecimal.ZERO : BigDecimal.valueOf(value); } } ruoyi-project/src/main/resources/mapper/project/CasePanoramaMapper.xml
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,76 @@ <?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.ruoyi.project.mapper.CasePanoramaMapper"> <sql id="casePanoramaColumns"> id, DonorName AS donorName, ReportTime AS reportTime, deptname AS deptName, ReporterName AS reporterName, Dontiontermination AS terminationFlag, workflow AS workflow, COALESCE(dd.dict_label, CAST(workflow AS CHAR)) AS workflowName, DonateTime AS donateTime, DonationHospital AS donationHospital, OrganName AS organName, OrganProcurement AS organProcurement, OrganTransplantation AS organTransplantation, COALESCE(DonorFamilysCost, 0) + COALESCE(medCost, 0) + COALESCE(ExpertCost, 0) + COALESCE(ItemCode3_4, 0) AS totalCost, DonorFamilysCost AS donorFamilyCost, medCost AS medCost, ExpertCost AS expertCost, ItemCode3_4 AS itemCode34, ItemCode42 AS itemCode42, ItemCode46 AS itemCode46, ItemCode50 AS itemCode50, ItemCode44 AS itemCode44, ItemCode47 AS itemCode47, ItemCode48 AS itemCode48, ItemCode21 AS itemCode21, ItemCode12 AS itemCode12, ItemCode17 AS itemCode17, ItemCode23 AS itemCode23, ItemCode25 AS itemCode25 </sql> <select id="selectCasePanoramaList" resultType="com.ruoyi.project.domain.CasePanorama"> SELECT <include refid="casePanoramaColumns"/> FROM v_donationfeestat v LEFT JOIN ( SELECT dict_value, MAX(dict_label) AS dict_label FROM sys_dict_data WHERE dict_type = 'sys_donornode' GROUP BY dict_value ) dd ON dd.dict_value COLLATE utf8mb4_general_ci = CAST(v.workflow AS CHAR) COLLATE utf8mb4_general_ci <where> <if test="req.donorName != null and req.donorName != ''"> AND DonorName LIKE CONCAT('%', #{req.donorName}, '%') </if> <if test="req.donateTimeBegin != null and req.donateTimeBegin != ''"> AND DonateTime >= #{req.donateTimeBegin} </if> <if test="req.donateTimeEnd != null and req.donateTimeEnd != ''"> AND DonateTime <= #{req.donateTimeEnd} </if> <if test="req.deptName != null and req.deptName != ''"> AND deptname = #{req.deptName} </if> <if test="req.reporterName != null and req.reporterName != ''"> AND ReporterName LIKE CONCAT('%', #{req.reporterName}, '%') </if> </where> ORDER BY ReportTime DESC, id DESC </select> <select id="selectDeptNames" resultType="java.lang.String"> SELECT DISTINCT deptname FROM v_donationfeestat WHERE deptname IS NOT NULL AND deptname != '' ORDER BY deptname </select> </mapper> ruoyi-project/src/main/resources/mapper/project/ServiceFundMapper.xml
@@ -51,6 +51,10 @@ <result property="uploadtime" column="uploadtime"/> <result property="flowlevel" column="FlowLevel"/> <result property="pretaxcost" column="PretaxCost"/> <result property="vatCost" column="vat_cost"/> <result property="cityTaxCost" column="city_tax_cost"/> <result property="laborPretaxCost" column="labor_pretax_cost"/> <result property="taxVersion" column="tax_version"/> <result property="taxedcost" column="TaxedCost"/> <result property="backflowlevel" column="backFlowLevel"/> <result property="zffs" column="zffs"/> @@ -87,6 +91,10 @@ UnitNo, UnitUserNo, PretaxCost, vat_cost, city_tax_cost, labor_pretax_cost, tax_version, TaxedCost, Phone, AnnexBankCard, ruoyi-project/src/main/resources/mapper/project/ServiceFunddetailMapper.xml
@@ -37,6 +37,10 @@ <result property="amount" column="Amount"/> <result property="taxamount" column="TaxAmount"/> <result property="taxedamount" column="TaxedAmount"/> <result property="vatAmount" column="vat_amount"/> <result property="cityTaxAmount" column="city_tax_amount"/> <result property="laborPretaxAmount" column="labor_pretax_amount"/> <result property="taxVersion" column="tax_version"/> <result property="prepaidamount" column="PrepaidAmount"/> <result property="invoicecount" column="InvoiceCount"/> <result property="attachcount" column="AttachCount"/> @@ -108,6 +112,10 @@ TaxAmount, InvoiceCount, TaxedAmount, vat_amount, city_tax_amount, labor_pretax_amount, tax_version, AttachCount, Quantity, Price, @@ -232,6 +240,10 @@ a.TaxAmount, a.InvoiceCount, a.TaxedAmount, a.vat_amount, a.city_tax_amount, a.labor_pretax_amount, a.tax_version, a.AttachCount, a.Quantity, a.Price, @@ -281,7 +293,15 @@ <select id="getTaxSum" parameterType="com.ruoyi.project.domain.vo.TaxMoneyByItemEO" resultType="com.ruoyi.project.domain.vo.TaxMoneySumEO"> SELECT sum(a.Amount) amounts, sum(a.TaxAmount) taxAmounts, sum(a.TaxedAmount) taxedAmounts, max(a.xh) as xh,a.IDCardNo SELECT sum(a.Amount) amounts, sum(COALESCE(a.labor_pretax_amount, a.Amount)) laborPretaxAmounts, sum(COALESCE(a.TaxAmount, 0)) taxAmounts, sum(COALESCE(a.TaxedAmount, 0)) taxedAmounts, sum(COALESCE(a.vat_amount, 0)) vatAmounts, sum(COALESCE(a.city_tax_amount, 0)) cityTaxAmounts, sum(CASE WHEN a.tax_version = 'v1' THEN 1 ELSE 0 END) v1Count, max(a.xh) xh, a.IDCardNo FROM service_funddetail a, service_fund b where a.FundID = b.id ruoyi-project/src/main/resources/mapper/project/ServiceFunddetailSharedMapper.xml
@@ -37,6 +37,9 @@ <result property="amount" column="Amount"/> <result property="taxamount" column="TaxAmount"/> <result property="taxedamount" column="TaxedAmount"/> <result property="vatAmount" column="vat_amount"/> <result property="cityTaxAmount" column="city_tax_amount"/> <result property="laborPretaxAmount" column="labor_pretax_amount"/> <result property="prepaidamount" column="PrepaidAmount"/> <result property="paidamount" column="paidAmount"/> <result property="paidtime" column="paidTime"/> @@ -96,6 +99,9 @@ Amount, TaxAmount, TaxedAmount, vat_amount, city_tax_amount, labor_pretax_amount, PrepaidAmount, paidAmount, paidTime, ruoyi-project/src/main/resources/mapper/project/ServiceFundtaxMapper.xml
@@ -15,6 +15,10 @@ <result property="managerno" column="ManagerNo"/> <result property="managername" column="ManagerName"/> <result property="pretaxamount" column="Pretaxamount"/> <result property="vatAmount" column="vat_amount"/> <result property="cityTaxAmount" column="city_tax_amount"/> <result property="laborPretaxAmount" column="labor_pretax_amount"/> <result property="taxVersion" column="tax_version"/> <result property="taxedamount" column="TaxedAmount"/> <result property="taxamount" column="TaxAmount"/> <result property="medicalcost" column="MedicalCost"/> @@ -60,6 +64,10 @@ Pretaxamount, TaxedAmount, TaxAmount, vat_amount, city_tax_amount, labor_pretax_amount, tax_version, MedicalCost, BodyMaintainCost, OrganGainCost, @@ -143,4 +151,10 @@ where del_flag = 0; </select> <select id="selectByIdForUpdate" resultMap="ServiceFundtaxResult"> <include refid="selectServiceFundtaxVo"/> where ID = #{id} for update </select> </mapper>