¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ruoyi.account.controller; |
| | | |
| | | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; |
| | | import com.ruoyi.account.pojo.AccountExpense; |
| | | import com.ruoyi.account.pojo.AccountIncome; |
| | | import com.ruoyi.account.service.AccountExpenseService; |
| | | import com.ruoyi.account.service.AccountFileService; |
| | | import com.ruoyi.account.service.AccountIncomeService; |
| | | import com.ruoyi.common.utils.SecurityUtils; |
| | | import com.ruoyi.dto.DateQueryDto; |
| | | import com.ruoyi.framework.security.LoginUser; |
| | | import com.ruoyi.framework.web.domain.AjaxResult; |
| | | import org.springframework.util.CollectionUtils; |
| | | import org.springframework.web.bind.annotation.*; |
| | | |
| | | import javax.annotation.Resource; |
| | | import javax.servlet.http.HttpServletResponse; |
| | | import java.util.Date; |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * è´¢å¡ç®¡ç--æ¯åºç®¡ç |
| | | */ |
| | | @RestController |
| | | @RequestMapping("/account/accountExpense") |
| | | public class AccountExpenseController { |
| | | |
| | | @Resource |
| | | private AccountExpenseService accountExpenseService; |
| | | |
| | | |
| | | /** |
| | | * æ°å¢ |
| | | * @param accountExpense |
| | | * @return |
| | | */ |
| | | @PostMapping("/add") |
| | | public AjaxResult add(@RequestBody AccountExpense accountExpense) { |
| | | accountExpense.setInputTime(new Date()); |
| | | LoginUser loginUser = SecurityUtils.getLoginUser(); |
| | | accountExpense.setInputUser(loginUser.getNickName()); |
| | | return AjaxResult.success(accountExpenseService.save(accountExpense)); |
| | | } |
| | | |
| | | /** |
| | | * å é¤ |
| | | * @param ids |
| | | * @return |
| | | */ |
| | | @DeleteMapping("/del") |
| | | public AjaxResult delQualityInspect(@RequestBody List<Integer> ids) { |
| | | if(CollectionUtils.isEmpty(ids)){ |
| | | return AjaxResult.error("è¯·éæ©è³å°ä¸æ¡æ°æ®"); |
| | | } |
| | | //å 餿£éªå |
| | | return AjaxResult.success(accountExpenseService.removeBatchByIds(ids)); |
| | | } |
| | | |
| | | /** |
| | | * ä¿®æ¹ |
| | | * @param accountExpense |
| | | * @return |
| | | */ |
| | | @PostMapping("/update") |
| | | public AjaxResult update(@RequestBody AccountExpense accountExpense) { |
| | | return AjaxResult.success(accountExpenseService.updateById(accountExpense)); |
| | | } |
| | | |
| | | /** |
| | | *å页æ¥è¯¢ |
| | | * @param page |
| | | * @param accountExpense |
| | | * @return |
| | | */ |
| | | @GetMapping("/listPage") |
| | | public AjaxResult accountExpenseListPage(Page page, AccountExpense accountExpense) { |
| | | return AjaxResult.success(accountExpenseService.accountExpenseListPage(page, accountExpense)); |
| | | } |
| | | |
| | | /** |
| | | * 详æ
|
| | | * @param id |
| | | * @return |
| | | */ |
| | | @GetMapping("/{id}") |
| | | public AjaxResult accountExpenseDetail(@PathVariable("id") Integer id) { |
| | | return AjaxResult.success(accountExpenseService.getById(id)); |
| | | } |
| | | |
| | | /** |
| | | * å¯¼åº |
| | | * @param response |
| | | * @param accountExpense |
| | | */ |
| | | @PostMapping("/export") |
| | | public void accountExpenseExport(HttpServletResponse response,AccountExpense accountExpense) { |
| | | accountExpenseService.accountExpenseExport(response, accountExpense); |
| | | } |
| | | |
| | | /** |
| | | * è´¢å¡æ¥è¡¨å¾è¡¨æ¥è¯¢ |
| | | * @param dateQueryDto |
| | | * @return |
| | | */ |
| | | @GetMapping("/report/forms") |
| | | public AjaxResult report(DateQueryDto dateQueryDto) { |
| | | return AjaxResult.success(accountExpenseService.report(dateQueryDto)); |
| | | } |
| | | |
| | | |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ruoyi.account.controller; |
| | | |
| | | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; |
| | | import com.ruoyi.account.pojo.AccountFile; |
| | | import com.ruoyi.account.service.AccountFileService; |
| | | import com.ruoyi.framework.web.domain.AjaxResult; |
| | | import com.ruoyi.quality.pojo.QualityInspectFile; |
| | | import com.ruoyi.quality.service.IQualityInspectFileService; |
| | | import org.springframework.util.CollectionUtils; |
| | | import org.springframework.web.bind.annotation.*; |
| | | |
| | | import javax.annotation.Resource; |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * è´¢å¡éä»¶ |
| | | */ |
| | | @RestController |
| | | @RequestMapping("/account/accountFile") |
| | | public class AccountFileController { |
| | | |
| | | |
| | | @Resource |
| | | private AccountFileService accountFileService; |
| | | |
| | | |
| | | /** |
| | | * æ°å¢ |
| | | * @param accountFile |
| | | * @return |
| | | */ |
| | | @PostMapping("/add") |
| | | public AjaxResult add(@RequestBody AccountFile accountFile) { |
| | | return AjaxResult.success(accountFileService.save(accountFile)); |
| | | } |
| | | |
| | | /** |
| | | * å é¤ |
| | | * @param ids |
| | | * @return |
| | | */ |
| | | @DeleteMapping("/del") |
| | | public AjaxResult delAccountFile(@RequestBody List<Integer> ids) { |
| | | if(CollectionUtils.isEmpty(ids)){ |
| | | return AjaxResult.error("è¯·éæ©è³å°ä¸æ¡æ°æ®"); |
| | | } |
| | | //å 餿£éªéä»¶ |
| | | return AjaxResult.success(accountFileService.removeBatchByIds(ids)); |
| | | } |
| | | |
| | | /** |
| | | *å页æ¥è¯¢ |
| | | * @param page |
| | | * @param accountFile |
| | | * @return |
| | | */ |
| | | @GetMapping("/listPage") |
| | | public AjaxResult accountFileListPage(Page page, AccountFile accountFile) { |
| | | return AjaxResult.success(accountFileService.accountFileListPage(page, accountFile)); |
| | | } |
| | | |
| | | |
| | | |
| | | |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ruoyi.account.controller; |
| | | |
| | | import com.baomidou.mybatisplus.core.toolkit.Wrappers; |
| | | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; |
| | | import com.ruoyi.account.pojo.AccountIncome; |
| | | import com.ruoyi.account.service.AccountFileService; |
| | | import com.ruoyi.account.service.AccountIncomeService; |
| | | import com.ruoyi.common.utils.SecurityUtils; |
| | | import com.ruoyi.framework.security.LoginUser; |
| | | import com.ruoyi.framework.web.domain.AjaxResult; |
| | | import com.ruoyi.quality.pojo.QualityInspect; |
| | | import com.ruoyi.quality.pojo.QualityInspectFile; |
| | | import com.ruoyi.quality.pojo.QualityInspectParam; |
| | | import com.ruoyi.quality.service.IQualityInspectFileService; |
| | | import com.ruoyi.quality.service.IQualityInspectParamService; |
| | | import com.ruoyi.quality.service.IQualityInspectService; |
| | | import org.springframework.util.CollectionUtils; |
| | | import org.springframework.web.bind.annotation.*; |
| | | |
| | | import javax.annotation.Resource; |
| | | import javax.servlet.http.HttpServletResponse; |
| | | import java.util.Date; |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * è´¢å¡ç®¡ç--æ¶å
¥ç®¡ç |
| | | */ |
| | | @RestController |
| | | @RequestMapping("/account/accountIncome") |
| | | public class AccountIncomeController { |
| | | |
| | | @Resource |
| | | private AccountIncomeService accountIncomeService; |
| | | |
| | | |
| | | /** |
| | | * æ°å¢ |
| | | * @param accountIncome |
| | | * @return |
| | | */ |
| | | @PostMapping("/add") |
| | | public AjaxResult add(@RequestBody AccountIncome accountIncome) { |
| | | accountIncome.setInputTime(new Date()); |
| | | LoginUser loginUser = SecurityUtils.getLoginUser(); |
| | | accountIncome.setInputUser(loginUser.getNickName()); |
| | | return AjaxResult.success(accountIncomeService.save(accountIncome)); |
| | | } |
| | | |
| | | /** |
| | | * å é¤ |
| | | * @param ids |
| | | * @return |
| | | */ |
| | | @DeleteMapping("/del") |
| | | public AjaxResult delQualityInspect(@RequestBody List<Integer> ids) { |
| | | if(CollectionUtils.isEmpty(ids)){ |
| | | return AjaxResult.error("è¯·éæ©è³å°ä¸æ¡æ°æ®"); |
| | | } |
| | | //å 餿£éªå |
| | | return AjaxResult.success(accountIncomeService.removeBatchByIds(ids)); |
| | | } |
| | | |
| | | /** |
| | | * ä¿®æ¹ |
| | | * @param accountIncome |
| | | * @return |
| | | */ |
| | | @PostMapping("/update") |
| | | public AjaxResult update(@RequestBody AccountIncome accountIncome) { |
| | | return AjaxResult.success(accountIncomeService.updateById(accountIncome)); |
| | | } |
| | | |
| | | /** |
| | | *å页æ¥è¯¢ |
| | | * @param page |
| | | * @param accountIncome |
| | | * @return |
| | | */ |
| | | @GetMapping("/listPage") |
| | | public AjaxResult accountIncomeListPage(Page page, AccountIncome accountIncome) { |
| | | return AjaxResult.success(accountIncomeService.accountIncomeListPage(page, accountIncome)); |
| | | } |
| | | |
| | | /** |
| | | * 详æ
|
| | | * @param id |
| | | * @return |
| | | */ |
| | | @GetMapping("/{id}") |
| | | public AjaxResult accountIncomeDetail(@PathVariable("id") Integer id) { |
| | | return AjaxResult.success(accountIncomeService.getById(id)); |
| | | } |
| | | |
| | | /** |
| | | * å¯¼åº |
| | | * @param response |
| | | * @param accountIncome |
| | | */ |
| | | @PostMapping("/export") |
| | | public void accountIncomeExport(HttpServletResponse response,AccountIncome accountIncome) { |
| | | accountIncomeService.accountIncomeExport(response, accountIncome); |
| | | } |
| | | |
| | | |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ruoyi.account.dto; |
| | | |
| | | import com.baomidou.mybatisplus.annotation.*; |
| | | import com.fasterxml.jackson.annotation.JsonFormat; |
| | | import com.ruoyi.account.pojo.AccountExpense; |
| | | import com.ruoyi.account.pojo.AccountIncome; |
| | | import com.ruoyi.dto.DateQueryDto; |
| | | import com.ruoyi.framework.aspectj.lang.annotation.Excel; |
| | | import io.swagger.annotations.ApiModelProperty; |
| | | import lombok.Data; |
| | | import org.springframework.format.annotation.DateTimeFormat; |
| | | |
| | | import javax.validation.constraints.NotBlank; |
| | | import java.io.Serializable; |
| | | import java.math.BigDecimal; |
| | | import java.time.LocalDateTime; |
| | | import java.util.Date; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | |
| | | /** |
| | | * è´¢å¡ç®¡ç--è´¢å¡æ¥è¡¨ |
| | | */ |
| | | |
| | | @Data |
| | | public class AccountDto implements Serializable { |
| | | |
| | | |
| | | /** |
| | | * æ»æ¶å
¥ |
| | | */ |
| | | private BigDecimal totalIncome; |
| | | |
| | | /** |
| | | * åç±»åæ¶å
¥éé¢(é宿¶å
¥ï¼æå¡æ¶å
¥ï¼å
¶ä»æ¶å
¥) |
| | | */ |
| | | private List<AccountDto2> incomeType; |
| | | |
| | | |
| | | /** |
| | | * æ¶å
¥ç¬æ° |
| | | */ |
| | | private Long incomeNumber; |
| | | |
| | | /** |
| | | * æ»æ¯åº |
| | | */ |
| | | private BigDecimal totalExpense; |
| | | |
| | | |
| | | /** |
| | | * åç±»åæ¯åºéé¢(åå
¬ç¨åï¼å工工èµï¼å·®æ
è´¹ï¼è®¾å¤è´¹ç¨ï¼å
¶ä») |
| | | */ |
| | | private List<AccountDto2> expenseType; |
| | | |
| | | /** |
| | | * æ¯åºç¬æ° |
| | | */ |
| | | private Long expenseNumber; |
| | | |
| | | /** |
| | | * åæ¶å
¥ |
| | | */ |
| | | private BigDecimal netRevenue; |
| | | |
| | | |
| | | |
| | | |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ruoyi.account.dto; |
| | | |
| | | import com.ruoyi.account.pojo.AccountExpense; |
| | | import com.ruoyi.account.pojo.AccountIncome; |
| | | import lombok.Data; |
| | | |
| | | import java.io.Serializable; |
| | | import java.math.BigDecimal; |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * è´¢å¡ç®¡ç--è´¢å¡æ¥è¡¨(ç±»å) |
| | | */ |
| | | |
| | | @Data |
| | | public class AccountDto2 implements Serializable { |
| | | |
| | | |
| | | /** |
| | | * ç±»å |
| | | */ |
| | | private String typeName; |
| | | |
| | | |
| | | |
| | | /** |
| | | * éé¢ |
| | | */ |
| | | private BigDecimal account; |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ruoyi.account.mapper; |
| | | |
| | | import com.baomidou.mybatisplus.core.mapper.BaseMapper; |
| | | import com.baomidou.mybatisplus.core.metadata.IPage; |
| | | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; |
| | | import com.ruoyi.account.dto.AccountDto; |
| | | import com.ruoyi.account.dto.AccountDto2; |
| | | import com.ruoyi.account.pojo.AccountExpense; |
| | | import com.ruoyi.account.pojo.AccountIncome; |
| | | import com.ruoyi.dto.DateQueryDto; |
| | | import org.apache.ibatis.annotations.Mapper; |
| | | import org.apache.ibatis.annotations.Param; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | |
| | | @Mapper |
| | | public interface AccountExpenseMapper extends BaseMapper<AccountExpense> { |
| | | IPage<AccountExpense> accountExpenseListPage(Page page, @Param("accountExpense") AccountExpense accountExpense); |
| | | |
| | | List<AccountExpense> accountExpenseExport(@Param("accountExpense") AccountExpense accountExpense); |
| | | |
| | | |
| | | List<AccountDto2> report(@Param("dateQueryDto") DateQueryDto dateQueryDto); |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ruoyi.account.mapper; |
| | | |
| | | import com.baomidou.mybatisplus.core.mapper.BaseMapper; |
| | | import com.baomidou.mybatisplus.core.metadata.IPage; |
| | | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; |
| | | import com.ruoyi.account.pojo.AccountFile; |
| | | import com.ruoyi.quality.pojo.QualityInspectFile; |
| | | import org.apache.ibatis.annotations.Mapper; |
| | | import org.apache.ibatis.annotations.Param; |
| | | |
| | | @Mapper |
| | | public interface AccountFileMapper extends BaseMapper<AccountFile> { |
| | | |
| | | IPage<AccountFile> accountFileListPage(Page page, @Param("accountFile") AccountFile accountFile); |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ruoyi.account.mapper; |
| | | |
| | | import com.baomidou.mybatisplus.core.mapper.BaseMapper; |
| | | import com.baomidou.mybatisplus.core.metadata.IPage; |
| | | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; |
| | | import com.ruoyi.account.dto.AccountDto2; |
| | | import com.ruoyi.account.pojo.AccountFile; |
| | | import com.ruoyi.account.pojo.AccountIncome; |
| | | import com.ruoyi.dto.DateQueryDto; |
| | | import org.apache.ibatis.annotations.Mapper; |
| | | import org.apache.ibatis.annotations.Param; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | |
| | | @Mapper |
| | | public interface AccountIncomeMapper extends BaseMapper<AccountIncome> { |
| | | |
| | | IPage<AccountIncome> accountIncomeListPage(Page page, @Param("accountIncome") AccountIncome accountIncome); |
| | | |
| | | List<AccountIncome> accountIncomeExport(@Param("accountIncome") AccountIncome accountIncome); |
| | | |
| | | List<AccountDto2> report(@Param("dateQueryDto") DateQueryDto dateQueryDto); |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ruoyi.account.pojo; |
| | | |
| | | import com.baomidou.mybatisplus.annotation.*; |
| | | import com.fasterxml.jackson.annotation.JsonFormat; |
| | | import com.ruoyi.dto.DateQueryDto; |
| | | import com.ruoyi.framework.aspectj.lang.annotation.Excel; |
| | | import io.swagger.annotations.ApiModelProperty; |
| | | import lombok.Data; |
| | | import org.springframework.format.annotation.DateTimeFormat; |
| | | |
| | | import javax.validation.constraints.NotBlank; |
| | | import java.io.Serializable; |
| | | import java.math.BigDecimal; |
| | | import java.time.LocalDateTime; |
| | | import java.util.Date; |
| | | |
| | | /** |
| | | * è´¢å¡ç®¡ç--æ¯åºç®¡ç |
| | | * account_expense |
| | | */ |
| | | @TableName(value = "account_expense") |
| | | @Data |
| | | public class AccountExpense extends DateQueryDto implements Serializable { |
| | | private static final long serialVersionUID = 1L; |
| | | |
| | | /** |
| | | * åºå· |
| | | */ |
| | | @TableId(type = IdType.AUTO) |
| | | private Long id; |
| | | |
| | | /** |
| | | * æ¯åºæ¥æ |
| | | */ |
| | | @JsonFormat(pattern = "yyyy-MM-dd") |
| | | @DateTimeFormat(pattern = "yyyy-MM-dd") |
| | | @Excel(name = "æ¯åºæ¥æ", width = 30, dateFormat = "yyyy-MM-dd") |
| | | private Date expenseDate; |
| | | |
| | | /** |
| | | * æ¯åºç±»å(åå
¬ç¨åï¼å工工èµï¼å·®æ
è´¹ï¼è®¾å¤è´¹ç¨ï¼å
¶ä») |
| | | */ |
| | | @Excel(name = "æ¯åºç±»å",readConverterExp = "0=åå
¬ç¨å,1=å工工èµ,2=å·®æ
è´¹,3=设å¤è´¹ç¨,4=å
¶ä»") |
| | | @NotBlank(message = "æ¯åºç±»åä¸è½ä¸ºç©º!!") |
| | | private String expenseType; |
| | | |
| | | /** |
| | | * ä¾åºååç§° |
| | | */ |
| | | @Excel(name = "ä¾åºååç§°") |
| | | private String supplierName; |
| | | |
| | | /** |
| | | * æ¯åºéé¢ |
| | | */ |
| | | @Excel(name = "æ¯åºéé¢") |
| | | private BigDecimal expenseMoney; |
| | | |
| | | /** |
| | | * æ¯åºæè¿° |
| | | */ |
| | | @Excel(name = "æ¯åºæè¿°") |
| | | private String expenseDescribed; |
| | | |
| | | /** |
| | | * 仿¬¾æ¹å¼(ç°éï¼æ¯ç¥¨ï¼é¶è¡è½¬è´¦ï¼å
¶ä») |
| | | */ |
| | | @Excel(name = "仿¬¾æ¹å¼",readConverterExp = "0=ç°é,1=æ¯ç¥¨,2=é¶è¡è½¬è´¦,3=å
¶ä»") |
| | | private String expenseMethod; |
| | | |
| | | /** |
| | | * å票å·ç |
| | | */ |
| | | @Excel(name = "å票å·ç ") |
| | | private String invoiceNumber; |
| | | |
| | | /** |
| | | * 夿³¨ |
| | | */ |
| | | @Excel(name = "夿³¨") |
| | | private String note; |
| | | |
| | | /** |
| | | * å½å
¥äººå |
| | | */ |
| | | @Excel(name = "å½å
¥äººå") |
| | | private String inputUser; |
| | | |
| | | /** |
| | | * å½å
¥æ¶é´ |
| | | */ |
| | | @JsonFormat(pattern = "yyyy-MM-dd") |
| | | @DateTimeFormat(pattern = "yyyy-MM-dd") |
| | | @Excel(name = "å½å
¥æ¶é´", width = 30, dateFormat = "yyyy-MM-dd") |
| | | private Date inputTime; |
| | | |
| | | |
| | | @ApiModelProperty(value = "å建æ¶é´") |
| | | @TableField(fill = FieldFill.INSERT) |
| | | private LocalDateTime createTime; |
| | | |
| | | @ApiModelProperty(value = "åå»ºç¨æ·") |
| | | @TableField(fill = FieldFill.INSERT) |
| | | private Integer createUser; |
| | | |
| | | @ApiModelProperty(value = "ä¿®æ¹æ¶é´") |
| | | @TableField(fill = FieldFill.INSERT_UPDATE) |
| | | private LocalDateTime updateTime; |
| | | |
| | | @ApiModelProperty(value = "ä¿®æ¹ç¨æ·") |
| | | @TableField(fill = FieldFill.INSERT_UPDATE) |
| | | private Integer updateUser; |
| | | |
| | | @ApiModelProperty(value = "ç§æ·ID") |
| | | @TableField(fill = FieldFill.INSERT) |
| | | private Long tenantId; |
| | | |
| | | |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ruoyi.account.pojo; |
| | | |
| | | import com.baomidou.mybatisplus.annotation.*; |
| | | import com.ruoyi.framework.aspectj.lang.annotation.Excel; |
| | | import io.swagger.annotations.ApiModelProperty; |
| | | import lombok.Data; |
| | | |
| | | import javax.validation.constraints.NotBlank; |
| | | import java.io.Serializable; |
| | | import java.time.LocalDateTime; |
| | | |
| | | /** |
| | | * è´¢å¡ç®¡ç--éä»¶ |
| | | * account_file |
| | | */ |
| | | @TableName(value = "account_file") |
| | | @Data |
| | | public class AccountFile implements Serializable { |
| | | private static final long serialVersionUID = 1L; |
| | | |
| | | /** |
| | | * åºå· |
| | | */ |
| | | @TableId(type = IdType.AUTO) |
| | | private Long id; |
| | | |
| | | @ApiModelProperty(value = "æä»¶åç§°") |
| | | private String name; |
| | | |
| | | @ApiModelProperty(value = "æä»¶è·¯å¾") |
| | | private String url; |
| | | |
| | | @ApiModelProperty(value = "æä»¶å¤§å°") |
| | | private int fileSize; |
| | | |
| | | @ApiModelProperty(value = "è´¢å¡ID") |
| | | @NotBlank(message = "è´¢å¡idä¸è½ä¸ºç©º!") |
| | | private Long accountId; |
| | | |
| | | /** |
| | | * ç±»å(æ¶å
¥/æ¯åº) |
| | | */ |
| | | @ApiModelProperty(value = "ç±»å(æ¶å
¥/æ¯åº)") |
| | | private String accountType; |
| | | |
| | | @ApiModelProperty(value = "å建æ¶é´") |
| | | @TableField(fill = FieldFill.INSERT) |
| | | private LocalDateTime createTime; |
| | | |
| | | @ApiModelProperty(value = "ä¿®æ¹æ¶é´") |
| | | @TableField(fill = FieldFill.INSERT_UPDATE) |
| | | private LocalDateTime updateTime; |
| | | |
| | | @ApiModelProperty(value = "åå»ºç¨æ·") |
| | | @TableField(fill = FieldFill.INSERT) |
| | | private Integer createUser; |
| | | |
| | | @ApiModelProperty(value = "ä¿®æ¹ç¨æ·") |
| | | @TableField(fill = FieldFill.INSERT_UPDATE) |
| | | private Integer updateUser; |
| | | |
| | | @ApiModelProperty(value = "ç§æ·ID") |
| | | @TableField(fill = FieldFill.INSERT) |
| | | private Long tenantId; |
| | | |
| | | |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ruoyi.account.pojo; |
| | | |
| | | import com.baomidou.mybatisplus.annotation.*; |
| | | import com.fasterxml.jackson.annotation.JsonFormat; |
| | | import com.ruoyi.dto.DateQueryDto; |
| | | import com.ruoyi.framework.aspectj.lang.annotation.Excel; |
| | | import io.swagger.annotations.ApiModelProperty; |
| | | import lombok.Data; |
| | | import org.springframework.format.annotation.DateTimeFormat; |
| | | |
| | | import javax.validation.constraints.NotBlank; |
| | | import java.io.Serializable; |
| | | import java.math.BigDecimal; |
| | | import java.time.LocalDateTime; |
| | | import java.util.Date; |
| | | |
| | | /** |
| | | * è´¢å¡ç®¡ç--æ¶å
¥ç®¡ç |
| | | * account_income |
| | | */ |
| | | @TableName(value = "account_income") |
| | | @Data |
| | | public class AccountIncome extends DateQueryDto implements Serializable { |
| | | private static final long serialVersionUID = 1L; |
| | | |
| | | /** |
| | | * åºå· |
| | | */ |
| | | @TableId(type = IdType.AUTO) |
| | | private Long id; |
| | | |
| | | /** |
| | | * æ¶å
¥æ¥æ |
| | | */ |
| | | @JsonFormat(pattern = "yyyy-MM-dd") |
| | | @DateTimeFormat(pattern = "yyyy-MM-dd") |
| | | @Excel(name = "æ¶å
¥æ¥æ", width = 30, dateFormat = "yyyy-MM-dd") |
| | | private Date incomeDate; |
| | | |
| | | /** |
| | | * æ¶å
¥ç±»å(é宿¶å
¥ï¼æå¡æ¶å
¥ï¼å
¶ä»æ¶å
¥) |
| | | */ |
| | | @Excel(name = "æ¶å
¥ç±»å",readConverterExp = "0=é宿¶å
¥,1=æå¡æ¶å
¥,2=å
¶ä»æ¶å
¥") |
| | | @NotBlank(message = "æ¶å
¥ç±»åä¸è½ä¸ºç©º!!") |
| | | private String incomeType; |
| | | |
| | | /** |
| | | * 客æ·åç§° |
| | | */ |
| | | @Excel(name = "客æ·åç§°") |
| | | private String customerName; |
| | | |
| | | /** |
| | | * æ¶å
¥éé¢ |
| | | */ |
| | | @Excel(name = "æ¶å
¥éé¢") |
| | | private BigDecimal incomeMoney; |
| | | |
| | | /** |
| | | * æ¶å
¥æè¿° |
| | | */ |
| | | @Excel(name = "æ¶å
¥æè¿°") |
| | | private String incomeDescribed; |
| | | |
| | | /** |
| | | * æ¶æ¬¾æ¹å¼(ç°éï¼æ¯ç¥¨ï¼é¶è¡è½¬è´¦ï¼å
¶ä») |
| | | */ |
| | | @Excel(name = "æ¶æ¬¾æ¹å¼",readConverterExp = "0=ç°é,1=æ¯ç¥¨,2=é¶è¡è½¬è´¦,3=å
¶ä»") |
| | | private String incomeMethod; |
| | | |
| | | /** |
| | | * å票å·ç |
| | | */ |
| | | @Excel(name = "å票å·ç ") |
| | | private String invoiceNumber; |
| | | |
| | | /** |
| | | * 夿³¨ |
| | | */ |
| | | @Excel(name = "夿³¨") |
| | | private String note; |
| | | |
| | | /** |
| | | * å½å
¥äººå |
| | | */ |
| | | @Excel(name = "å½å
¥äººå") |
| | | private String inputUser; |
| | | |
| | | /** |
| | | * å½å
¥æ¶é´ |
| | | */ |
| | | @JsonFormat(pattern = "yyyy-MM-dd") |
| | | @DateTimeFormat(pattern = "yyyy-MM-dd") |
| | | @Excel(name = "å½å
¥æ¶é´", width = 30, dateFormat = "yyyy-MM-dd") |
| | | private Date inputTime; |
| | | |
| | | |
| | | @ApiModelProperty(value = "å建æ¶é´") |
| | | @TableField(fill = FieldFill.INSERT) |
| | | private LocalDateTime createTime; |
| | | |
| | | @ApiModelProperty(value = "åå»ºç¨æ·") |
| | | @TableField(fill = FieldFill.INSERT) |
| | | private Integer createUser; |
| | | |
| | | @ApiModelProperty(value = "ä¿®æ¹æ¶é´") |
| | | @TableField(fill = FieldFill.INSERT_UPDATE) |
| | | private LocalDateTime updateTime; |
| | | |
| | | @ApiModelProperty(value = "ä¿®æ¹ç¨æ·") |
| | | @TableField(fill = FieldFill.INSERT_UPDATE) |
| | | private Integer updateUser; |
| | | |
| | | @ApiModelProperty(value = "ç§æ·ID") |
| | | @TableField(fill = FieldFill.INSERT) |
| | | private Long tenantId; |
| | | |
| | | |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ruoyi.account.service; |
| | | |
| | | import com.baomidou.mybatisplus.core.metadata.IPage; |
| | | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; |
| | | import com.baomidou.mybatisplus.extension.service.IService; |
| | | import com.ruoyi.account.dto.AccountDto; |
| | | import com.ruoyi.account.pojo.AccountExpense; |
| | | import com.ruoyi.account.pojo.AccountIncome; |
| | | import com.ruoyi.dto.DateQueryDto; |
| | | |
| | | import javax.servlet.http.HttpServletResponse; |
| | | |
| | | public interface AccountExpenseService extends IService<AccountExpense> { |
| | | |
| | | IPage<AccountExpense> accountExpenseListPage(Page page, AccountExpense accountExpense); |
| | | |
| | | void accountExpenseExport(HttpServletResponse response, AccountExpense accountExpense); |
| | | |
| | | AccountDto report(DateQueryDto dateQueryDto); |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ruoyi.account.service; |
| | | |
| | | import com.baomidou.mybatisplus.core.metadata.IPage; |
| | | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; |
| | | import com.baomidou.mybatisplus.extension.service.IService; |
| | | import com.ruoyi.account.pojo.AccountFile; |
| | | import com.ruoyi.quality.pojo.QualityInspectFile; |
| | | |
| | | public interface AccountFileService extends IService<AccountFile> { |
| | | |
| | | |
| | | IPage<AccountFile> accountFileListPage(Page page, AccountFile accountFile); |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ruoyi.account.service; |
| | | |
| | | import com.baomidou.mybatisplus.core.metadata.IPage; |
| | | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; |
| | | import com.baomidou.mybatisplus.extension.service.IService; |
| | | import com.ruoyi.account.pojo.AccountFile; |
| | | import com.ruoyi.account.pojo.AccountIncome; |
| | | |
| | | import javax.servlet.http.HttpServletResponse; |
| | | |
| | | public interface AccountIncomeService extends IService<AccountIncome> { |
| | | |
| | | |
| | | IPage<AccountIncome> accountIncomeListPage(Page page, AccountIncome accountIncome); |
| | | |
| | | void accountIncomeExport(HttpServletResponse response, AccountIncome accountIncome); |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ruoyi.account.service.impl; |
| | | |
| | | |
| | | import com.baomidou.mybatisplus.core.metadata.IPage; |
| | | import com.baomidou.mybatisplus.core.toolkit.Wrappers; |
| | | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; |
| | | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; |
| | | import com.ruoyi.account.dto.AccountDto; |
| | | import com.ruoyi.account.dto.AccountDto2; |
| | | import com.ruoyi.account.mapper.AccountExpenseMapper; |
| | | import com.ruoyi.account.mapper.AccountFileMapper; |
| | | import com.ruoyi.account.mapper.AccountIncomeMapper; |
| | | import com.ruoyi.account.pojo.AccountExpense; |
| | | import com.ruoyi.account.pojo.AccountIncome; |
| | | import com.ruoyi.account.service.AccountExpenseService; |
| | | import com.ruoyi.account.service.AccountIncomeService; |
| | | import com.ruoyi.common.utils.poi.ExcelUtil; |
| | | import com.ruoyi.dto.DateQueryDto; |
| | | import lombok.AllArgsConstructor; |
| | | import org.springframework.stereotype.Service; |
| | | |
| | | import javax.servlet.http.HttpServletResponse; |
| | | import java.math.BigDecimal; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | |
| | | @AllArgsConstructor |
| | | @Service |
| | | public class AccountExpenseServiceImpl extends ServiceImpl<AccountExpenseMapper, AccountExpense> implements AccountExpenseService { |
| | | |
| | | private AccountExpenseMapper accountExpenseMapper; |
| | | |
| | | private AccountIncomeMapper accountIncomeMapper; |
| | | |
| | | |
| | | //å页æ¥è¯¢ |
| | | @Override |
| | | public IPage<AccountExpense> accountExpenseListPage(Page page, AccountExpense accountExpense) { |
| | | return accountExpenseMapper.accountExpenseListPage(page,accountExpense); |
| | | } |
| | | |
| | | //å¯¼åº |
| | | @Override |
| | | public void accountExpenseExport(HttpServletResponse response, AccountExpense accountExpense) { |
| | | List<AccountExpense> accountExpenses =accountExpenseMapper.accountExpenseExport(accountExpense); |
| | | ExcelUtil<AccountExpense> util = new ExcelUtil<AccountExpense>(AccountExpense.class); |
| | | util.exportExcel(response, accountExpenses, "æ¯åºç®¡ç导åº"); |
| | | } |
| | | |
| | | //è´¢å¡æ¥è¡¨å¾è¡¨ |
| | | @Override |
| | | public AccountDto report(DateQueryDto dateQueryDto) { |
| | | AccountDto accountDto = new AccountDto(); |
| | | //è·å该段æ¶é´å
çæææ¶å
¥ |
| | | List<AccountDto2> accountIncomes =accountIncomeMapper.report(dateQueryDto); |
| | | accountDto.setIncomeType(accountIncomes); |
| | | Long incomeNumber = accountIncomeMapper.selectCount(Wrappers.<AccountIncome>lambdaQuery() |
| | | .between(AccountIncome::getIncomeDate, dateQueryDto.getEntryDateStart(), dateQueryDto.getEntryDateEnd())); |
| | | accountDto.setIncomeNumber(incomeNumber); |
| | | BigDecimal totalIncome = accountIncomes.stream().map(AccountDto2::getAccount).reduce(BigDecimal.ZERO, BigDecimal::add); |
| | | accountDto.setTotalIncome(totalIncome); |
| | | //è·å该段æ¶é´å
çæææ¯åº |
| | | List<AccountDto2> accountExpenses =accountExpenseMapper.report(dateQueryDto); |
| | | accountDto.setExpenseType(accountExpenses); |
| | | Long expenseNumber = accountExpenseMapper.selectCount(Wrappers.<AccountExpense>lambdaQuery() |
| | | .between(AccountExpense::getExpenseDate, dateQueryDto.getEntryDateStart(), dateQueryDto.getEntryDateEnd())); |
| | | accountDto.setExpenseNumber(expenseNumber); |
| | | BigDecimal totalExpense = accountExpenses.stream().map(AccountDto2::getAccount).reduce(BigDecimal.ZERO, BigDecimal::add); |
| | | accountDto.setTotalExpense(totalExpense); |
| | | //åæ¶å
¥ |
| | | BigDecimal netRevenue = totalIncome.subtract(totalExpense); |
| | | accountDto.setNetRevenue(netRevenue); |
| | | return accountDto; |
| | | } |
| | | |
| | | |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ruoyi.account.service.impl; |
| | | |
| | | |
| | | import com.baomidou.mybatisplus.core.metadata.IPage; |
| | | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; |
| | | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; |
| | | import com.ruoyi.account.mapper.AccountFileMapper; |
| | | import com.ruoyi.account.pojo.AccountFile; |
| | | import com.ruoyi.account.service.AccountFileService; |
| | | import com.ruoyi.quality.mapper.QualityInspectFileMapper; |
| | | import com.ruoyi.quality.pojo.QualityInspectFile; |
| | | import com.ruoyi.quality.service.IQualityInspectFileService; |
| | | import lombok.AllArgsConstructor; |
| | | import org.springframework.stereotype.Service; |
| | | |
| | | @AllArgsConstructor |
| | | @Service |
| | | public class AccountFileServiceImpl extends ServiceImpl<AccountFileMapper, AccountFile> implements AccountFileService { |
| | | |
| | | private AccountFileMapper accountFileMapper; |
| | | |
| | | |
| | | @Override |
| | | public IPage<AccountFile> accountFileListPage(Page page, AccountFile accountFile) { |
| | | return accountFileMapper.accountFileListPage(page,accountFile); |
| | | } |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ruoyi.account.service.impl; |
| | | |
| | | |
| | | import com.baomidou.mybatisplus.core.metadata.IPage; |
| | | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; |
| | | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; |
| | | import com.ruoyi.account.mapper.AccountFileMapper; |
| | | import com.ruoyi.account.mapper.AccountIncomeMapper; |
| | | import com.ruoyi.account.pojo.AccountFile; |
| | | import com.ruoyi.account.pojo.AccountIncome; |
| | | import com.ruoyi.account.service.AccountFileService; |
| | | import com.ruoyi.account.service.AccountIncomeService; |
| | | import com.ruoyi.common.utils.poi.ExcelUtil; |
| | | import com.ruoyi.quality.pojo.QualityInspect; |
| | | import lombok.AllArgsConstructor; |
| | | import org.springframework.stereotype.Service; |
| | | |
| | | import javax.servlet.http.HttpServletResponse; |
| | | import java.util.List; |
| | | |
| | | @AllArgsConstructor |
| | | @Service |
| | | public class AccountIncomeServiceImpl extends ServiceImpl<AccountIncomeMapper, AccountIncome> implements AccountIncomeService { |
| | | |
| | | private AccountIncomeMapper accountIncomeMapper; |
| | | |
| | | |
| | | //å页æ¥è¯¢ |
| | | @Override |
| | | public IPage<AccountIncome> accountIncomeListPage(Page page, AccountIncome accountIncome) { |
| | | return accountIncomeMapper.accountIncomeListPage(page,accountIncome); |
| | | } |
| | | |
| | | //å¯¼åº |
| | | @Override |
| | | public void accountIncomeExport(HttpServletResponse response, AccountIncome accountIncome) { |
| | | List<AccountIncome> accountIncomes =accountIncomeMapper.accountIncomeExport(accountIncome); |
| | | ExcelUtil<AccountIncome> util = new ExcelUtil<AccountIncome>(AccountIncome.class); |
| | | util.exportExcel(response, accountIncomes, "æ¶å
¥ç®¡ç导åº"); |
| | | } |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | <?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.account.mapper.AccountExpenseMapper"> |
| | | <select id="accountExpenseListPage" resultType="com.ruoyi.account.pojo.AccountExpense"> |
| | | SELECT |
| | | * |
| | | FROM account_expense |
| | | where |
| | | 1=1 |
| | | <if test="accountExpense.entryDateStart != null and accountExpense.entryDateStart != '' "> |
| | | AND expense_date >= DATE_FORMAT(#{accountExpense.entryDateStart},'%Y-%m-%d') |
| | | </if> |
| | | <if test="accountExpense.entryDateEnd != null and accountExpense.entryDateEnd != '' "> |
| | | AND expense_date <= DATE_FORMAT(#{accountExpense.entryDateEnd},'%Y-%m-%d') |
| | | </if> |
| | | <if test="accountExpense.expenseType != null and accountExpense.expenseType != '' "> |
| | | AND expense_type = #{accountExpense.expenseType} |
| | | </if> |
| | | <if test="accountExpense.expenseMethod != null and accountExpense.expenseMethod != '' "> |
| | | AND expense_method = #{accountExpense.expenseMethod} |
| | | </if> |
| | | </select> |
| | | <select id="accountExpenseExport" resultType="com.ruoyi.account.pojo.AccountExpense"> |
| | | SELECT |
| | | * |
| | | FROM account_expense |
| | | where |
| | | 1=1 |
| | | <if test="accountExpense.entryDateStart != null and accountExpense.entryDateStart != '' "> |
| | | AND expense_date >= DATE_FORMAT(#{accountExpense.entryDateStart},'%Y-%m-%d') |
| | | </if> |
| | | <if test="accountExpense.entryDateEnd != null and accountExpense.entryDateEnd != '' "> |
| | | AND expense_date <= DATE_FORMAT(#{accountExpense.entryDateEnd},'%Y-%m-%d') |
| | | </if> |
| | | <if test="accountExpense.expenseType != null and accountExpense.expenseType != '' "> |
| | | AND expense_type = #{accountExpense.expenseType} |
| | | </if> |
| | | <if test="accountExpense.expenseMethod != null and accountExpense.expenseMethod != '' "> |
| | | AND expense_method = #{accountExpense.expenseMethod} |
| | | </if> |
| | | </select> |
| | | <select id="report" resultType="com.ruoyi.account.dto.AccountDto2"> |
| | | SELECT |
| | | sdd.dict_label typeName, |
| | | sum(expense_money) account |
| | | FROM account_expense ae |
| | | left join sys_dict_data sdd on ae.expense_type = sdd.dict_value and sdd.dict_type='expense_types' |
| | | where |
| | | 1=1 |
| | | <if test="dateQueryDto.entryDateStart != null and dateQueryDto.entryDateStart != '' "> |
| | | AND expense_date >= DATE_FORMAT(#{dateQueryDto.entryDateStart},'%Y-%m-%d') |
| | | </if> |
| | | <if test="dateQueryDto.entryDateEnd != null and dateQueryDto.entryDateEnd != '' "> |
| | | AND expense_date <= DATE_FORMAT(#{dateQueryDto.entryDateEnd},'%Y-%m-%d') |
| | | </if> |
| | | group by expense_type |
| | | </select> |
| | | |
| | | </mapper> |
¶Ô±ÈÐÂÎļþ |
| | |
| | | <?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.account.mapper.AccountFileMapper"> |
| | | <select id="accountFileListPage" resultType="com.ruoyi.account.pojo.AccountFile"> |
| | | SELECT |
| | | * |
| | | FROM account_file |
| | | where |
| | | 1=1 |
| | | <if test="accountFile.name != null and accountFile.name != '' "> |
| | | AND name = #{accountFile.name} |
| | | </if> |
| | | <if test="accountFile.accountType != null and accountFile.accountType != '' "> |
| | | AND account_type = #{accountFile.accountType} |
| | | </if> |
| | | </select> |
| | | </mapper> |
¶Ô±ÈÐÂÎļþ |
| | |
| | | <?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.account.mapper.AccountIncomeMapper"> |
| | | |
| | | <select id="accountIncomeListPage" resultType="com.ruoyi.account.pojo.AccountIncome"> |
| | | SELECT |
| | | * |
| | | FROM account_income |
| | | where |
| | | 1=1 |
| | | <if test="accountIncome.entryDateStart != null and accountIncome.entryDateStart != '' "> |
| | | AND income_date >= DATE_FORMAT(#{accountIncome.entryDateStart},'%Y-%m-%d') |
| | | </if> |
| | | <if test="accountIncome.entryDateEnd != null and accountIncome.entryDateEnd != '' "> |
| | | AND income_date <= DATE_FORMAT(#{accountIncome.entryDateEnd},'%Y-%m-%d') |
| | | </if> |
| | | <if test="accountIncome.incomeType != null and accountIncome.incomeType != '' "> |
| | | AND income_type = #{accountIncome.incomeType} |
| | | </if> |
| | | <if test="accountIncome.incomeMethod != null and accountIncome.incomeMethod != '' "> |
| | | AND income_method = #{accountIncome.incomeMethod} |
| | | </if> |
| | | </select> |
| | | <select id="accountIncomeExport" resultType="com.ruoyi.account.pojo.AccountIncome"> |
| | | SELECT |
| | | * |
| | | FROM account_income |
| | | where |
| | | 1=1 |
| | | <if test="accountIncome.entryDateStart != null and accountIncome.entryDateStart != '' "> |
| | | AND income_date >= DATE_FORMAT(#{accountIncome.entryDateStart},'%Y-%m-%d') |
| | | </if> |
| | | <if test="accountIncome.entryDateEnd != null and accountIncome.entryDateEnd != '' "> |
| | | AND income_date <= DATE_FORMAT(#{accountIncome.entryDateEnd},'%Y-%m-%d') |
| | | </if> |
| | | <if test="accountIncome.incomeType != null and accountIncome.incomeType != '' "> |
| | | AND income_type = #{accountIncome.incomeType} |
| | | </if> |
| | | <if test="accountIncome.incomeMethod != null and accountIncome.incomeMethod != '' "> |
| | | AND income_method = #{accountIncome.incomeMethod} |
| | | </if> |
| | | </select> |
| | | <select id="report" resultType="com.ruoyi.account.dto.AccountDto2"> |
| | | SELECT |
| | | sdd.dict_label typeName, |
| | | sum(income_money) account |
| | | FROM account_income ai |
| | | left join sys_dict_data sdd on ai.income_type = sdd.dict_value and sdd.dict_type='income_types' |
| | | where |
| | | 1=1 |
| | | <if test="dateQueryDto.entryDateStart != null and dateQueryDto.entryDateStart != '' "> |
| | | AND income_date >= DATE_FORMAT(#{dateQueryDto.entryDateStart},'%Y-%m-%d') |
| | | </if> |
| | | <if test="dateQueryDto.entryDateEnd != null and dateQueryDto.entryDateEnd != '' "> |
| | | AND income_date <= DATE_FORMAT(#{dateQueryDto.entryDateEnd},'%Y-%m-%d') |
| | | </if> |
| | | group by income_type |
| | | </select> |
| | | </mapper> |