commit
e4dd28bc0d
@ -0,0 +1,123 @@
|
||||
package au.com.royalpay.payment.manage.management.channelreconciliationfile;
|
||||
|
||||
import au.com.royalpay.payment.core.ChannelBillValidator;
|
||||
import au.com.royalpay.payment.core.beans.ChannelBillPackage;
|
||||
import au.com.royalpay.payment.core.exceptions.ChannelNotSupportedException;
|
||||
import au.com.royalpay.payment.tools.defines.PayChannel;
|
||||
import com.github.miemiedev.mybatis.paginator.domain.PageList;
|
||||
import org.apache.commons.io.IOUtils;
|
||||
import org.springframework.stereotype.Component;
|
||||
import org.thymeleaf.util.ListUtils;
|
||||
|
||||
import java.io.ByteArrayInputStream;
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Optional;
|
||||
import java.util.stream.Collectors;
|
||||
import java.util.zip.ZipEntry;
|
||||
import java.util.zip.ZipOutputStream;
|
||||
|
||||
/**
|
||||
* @Description
|
||||
* @title: 渠道对账文件
|
||||
* @Date 2020/11/5 15:06
|
||||
* @author: zhangTao
|
||||
*/
|
||||
@Component
|
||||
public class ChannelReconciliationFile {
|
||||
|
||||
private ChannelReconciliationFileTunnel tunnel;
|
||||
private final Map<PayChannel, ChannelBillValidator> validatorMap ;
|
||||
|
||||
public ChannelReconciliationFile(ChannelReconciliationFileTunnel tunnel ,ChannelBillValidator[] validators) {
|
||||
this.tunnel = tunnel;
|
||||
validatorMap = Arrays.stream(validators).collect(Collectors.toMap(ChannelBillValidator::payChannel,channelBillValidator -> channelBillValidator));
|
||||
}
|
||||
|
||||
public PageList<ChannelReconciliationFileDTO> list(ChannelReconciliationFileQueryParameter channelReconciliationFileQueryParameter) {
|
||||
return this.tunnel.list(channelReconciliationFileQueryParameter);
|
||||
}
|
||||
|
||||
|
||||
public ChannelReconciliationFileContent download(ChannelReconciliationFileDownloadParameter from) {
|
||||
Optional<Map.Entry<PayChannel, ChannelBillValidator>> channel = findChannels(from.getChannel());
|
||||
|
||||
if (!channel.isPresent()) {
|
||||
throw new ChannelNotSupportedException();
|
||||
}
|
||||
|
||||
Map.Entry<PayChannel, ChannelBillValidator> channelChannelBillValidatorEntry = channel.get();
|
||||
|
||||
ChannelBillValidator channelBillValidator = channelChannelBillValidatorEntry.getValue();
|
||||
|
||||
List<ChannelBillPackage> channelBillPackageList = selectTypeDown(from ,channelBillValidator);
|
||||
|
||||
if (isNull(channelBillPackageList)) {
|
||||
throw new ChannelReconciliationFileEmptyException();
|
||||
}
|
||||
|
||||
|
||||
if (isMultiFile(channelBillPackageList)) {
|
||||
return genMultiFile(channelBillPackageList);
|
||||
}
|
||||
|
||||
return genSingleFile(channelBillPackageList.get(0));
|
||||
}
|
||||
|
||||
private List<ChannelBillPackage> selectTypeDown(ChannelReconciliationFileDownloadParameter from, ChannelBillValidator channelBillValidator) {
|
||||
|
||||
if (from.billType().equals("SETTLEMENT")){
|
||||
return channelBillValidator
|
||||
.downloadRawSettlementFiles(from.pid(), from.billDate(), from.isUseCash());
|
||||
|
||||
}
|
||||
return channelBillValidator.downloadRawTransactionFiles(from.pid(), from.billDate(), from.isUseCash());
|
||||
|
||||
}
|
||||
|
||||
private boolean isMultiFile(List<ChannelBillPackage> channelBillPackageList) {
|
||||
return channelBillPackageList.size() > 1;
|
||||
}
|
||||
|
||||
private boolean isNull(List<ChannelBillPackage> channelBillPackageList){
|
||||
return ListUtils.isEmpty(channelBillPackageList);
|
||||
}
|
||||
|
||||
private ChannelReconciliationFileContent genSingleFile(ChannelBillPackage channelBillPackage) {
|
||||
return ChannelReconciliationFileContent.instance(channelBillPackage.getFilename(),
|
||||
channelBillPackage.getBillContent());
|
||||
}
|
||||
|
||||
private ChannelReconciliationFileContent genMultiFile(List<ChannelBillPackage> channelBillPackageList) {
|
||||
try (ByteArrayOutputStream stream = new ByteArrayOutputStream(); ZipOutputStream zipOutputStream = new ZipOutputStream(stream)) {
|
||||
|
||||
channelBillPackageList.forEach(bill -> toZipOutputStream(bill, zipOutputStream));
|
||||
|
||||
zipOutputStream.close();
|
||||
stream.close();
|
||||
return ChannelReconciliationFileContent.instance("reconciliationFile.zip", stream.toByteArray());
|
||||
} catch (IOException e) {
|
||||
throw new MultiFileChannelReconciliationException();
|
||||
}
|
||||
}
|
||||
|
||||
private void toZipOutputStream(ChannelBillPackage channelBillPackage ,ZipOutputStream zipOutputStream){
|
||||
try (ByteArrayInputStream fis = new ByteArrayInputStream(channelBillPackage.getBillContent())) {
|
||||
ZipEntry zipEntryXtv = new ZipEntry(channelBillPackage.getFilename());
|
||||
zipOutputStream.putNextEntry(zipEntryXtv);
|
||||
IOUtils.copy(fis, zipOutputStream);
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private Optional<Map.Entry<PayChannel, ChannelBillValidator>> findChannels(String channel) {
|
||||
return validatorMap.entrySet().stream().filter(entry -> channel.equals(entry.getKey().getChannelCode())).findAny();
|
||||
}
|
||||
|
||||
|
||||
}
|
@ -0,0 +1,66 @@
|
||||
package au.com.royalpay.payment.manage.management.channelreconciliationfile;
|
||||
|
||||
|
||||
import org.apache.commons.io.FilenameUtils;
|
||||
|
||||
/**
|
||||
* 渠道对账文件内容
|
||||
* @Date 2020/11/5 17:21
|
||||
* @author: zhangTao
|
||||
*/
|
||||
public class ChannelReconciliationFileContent {
|
||||
|
||||
private static String SUFFIX =".txt";
|
||||
private final FileName fileName;
|
||||
private final byte[] content;
|
||||
|
||||
private ChannelReconciliationFileContent(String fileName, byte[] content) {
|
||||
this.fileName = new FileName(fileName) ;
|
||||
this.content = content;
|
||||
}
|
||||
|
||||
public String name() {
|
||||
return this.fileName.getName();
|
||||
}
|
||||
|
||||
|
||||
public int length() {
|
||||
return this.content.length;
|
||||
}
|
||||
|
||||
public byte[] content() {
|
||||
return this.content;
|
||||
}
|
||||
|
||||
public static ChannelReconciliationFileContent instance(String fileName, byte[] billContent) {
|
||||
if (!checkFileName(fileName)){
|
||||
fileName = fileName+SUFFIX;
|
||||
// throw new ChannelReconciliationFileNameSuffixException();
|
||||
}
|
||||
return new ChannelReconciliationFileContent(fileName, billContent);
|
||||
}
|
||||
|
||||
private static boolean checkFileName(String fileName) {
|
||||
return fileName.contains(".");
|
||||
}
|
||||
|
||||
private class FileName {
|
||||
|
||||
private final String name;
|
||||
private final String type;
|
||||
|
||||
public FileName(String name) {
|
||||
this.name = name;
|
||||
this.type = FilenameUtils.getExtension(name);
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public String getType() {
|
||||
return type;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,49 @@
|
||||
package au.com.royalpay.payment.manage.management.channelreconciliationfile;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
/**
|
||||
* @Description
|
||||
* @title:
|
||||
* @Date 2020/11/4 16:40
|
||||
* @author: zhangTao
|
||||
*/
|
||||
@Data
|
||||
public class ChannelReconciliationFileDTO {
|
||||
|
||||
|
||||
private String batchId;
|
||||
/**
|
||||
*
|
||||
*/
|
||||
private String channel;
|
||||
/**
|
||||
*
|
||||
*/
|
||||
private String pid;
|
||||
/**
|
||||
*
|
||||
*/
|
||||
private String billDate;
|
||||
/**
|
||||
*
|
||||
*/
|
||||
private String billType;
|
||||
/**
|
||||
*
|
||||
*/
|
||||
private String createTime;
|
||||
|
||||
private String fileId;
|
||||
|
||||
|
||||
private String filename;
|
||||
|
||||
private String fileType;
|
||||
|
||||
private String attachId;
|
||||
/**
|
||||
*
|
||||
*/
|
||||
private String attachUrl;
|
||||
}
|
@ -0,0 +1,51 @@
|
||||
package au.com.royalpay.payment.manage.management.channelreconciliationfile;
|
||||
|
||||
import java.util.Date;
|
||||
|
||||
/**
|
||||
* @Description
|
||||
* @title:
|
||||
* @Date 2020/11/16 14:42
|
||||
* @author: zhangTao
|
||||
*/
|
||||
public class ChannelReconciliationFileDownloadParameter {
|
||||
private DownloadParameter parameter;
|
||||
private boolean useCashFlag;
|
||||
|
||||
public ChannelReconciliationFileDownloadParameter(String pid, Date billDate, String channel, boolean isUseCash,String billType) {
|
||||
this.parameter = new DownloadParameter(pid, billDate, channel,billType);
|
||||
this.useCashFlag = isUseCash;
|
||||
}
|
||||
|
||||
public String getChannel() {
|
||||
return this.parameter.channel;
|
||||
}
|
||||
|
||||
public boolean isUseCash() {
|
||||
return this.useCashFlag;
|
||||
}
|
||||
|
||||
public String pid(){
|
||||
return this.parameter.pid;
|
||||
}
|
||||
public Date billDate(){
|
||||
return this.parameter.billDate;
|
||||
}
|
||||
public String billType(){
|
||||
return this.parameter.billType;
|
||||
}
|
||||
|
||||
|
||||
private static class DownloadParameter {
|
||||
private String pid;
|
||||
private String channel;
|
||||
private Date billDate;
|
||||
private String billType;
|
||||
public DownloadParameter(String pid, Date billDate, String channel,String billType) {
|
||||
this.pid = pid;
|
||||
this.billDate = billDate;
|
||||
this.channel = channel;
|
||||
this.billType = billType;
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,15 @@
|
||||
package au.com.royalpay.payment.manage.management.channelreconciliationfile;
|
||||
|
||||
/**
|
||||
* @Description
|
||||
* @title:
|
||||
* @Date 2020/11/12 11:27
|
||||
* @author: zhangTao
|
||||
*/
|
||||
public class ChannelReconciliationFileEmptyException extends RuntimeException {
|
||||
|
||||
public ChannelReconciliationFileEmptyException() {
|
||||
super("渠道对账文件查询为空");
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,12 @@
|
||||
package au.com.royalpay.payment.manage.management.channelreconciliationfile;
|
||||
|
||||
/**
|
||||
* @Description
|
||||
* @title:
|
||||
* @Date 2020/11/19 18:35
|
||||
* @author: zhangTao
|
||||
*/
|
||||
public class ChannelReconciliationFileNameSuffixException extends RuntimeException {
|
||||
|
||||
|
||||
}
|
@ -0,0 +1,35 @@
|
||||
package au.com.royalpay.payment.manage.management.channelreconciliationfile;
|
||||
|
||||
|
||||
import au.com.royalpay.payment.manage.management.channelreconciliationfile.common.TimeRangeAndPageSizeQueryParameter;
|
||||
|
||||
/**
|
||||
* @Description
|
||||
* @title: 渠道对账文件查询参数
|
||||
* @Date 2020/11/16 11:54
|
||||
* @author: zhangTao
|
||||
*/
|
||||
public class ChannelReconciliationFileQueryParameter {
|
||||
|
||||
private TimeRangeAndPageSizeQueryParameter timeRangeAndPageSizeQueryParameter;
|
||||
private String channel;
|
||||
private String billType;
|
||||
|
||||
public ChannelReconciliationFileQueryParameter(TimeRangeAndPageSizeQueryParameter timeRangeAndPageSizeQueryParameter, String channel ,String billType) {
|
||||
this.timeRangeAndPageSizeQueryParameter = timeRangeAndPageSizeQueryParameter;
|
||||
this.channel = channel;
|
||||
this.billType = billType;
|
||||
}
|
||||
|
||||
public String getChannel() {
|
||||
return channel;
|
||||
}
|
||||
|
||||
public String getBillType() {
|
||||
return billType;
|
||||
}
|
||||
|
||||
public TimeRangeAndPageSizeQueryParameter getTimeRangeAndPageSizeQueryParameter() {
|
||||
return timeRangeAndPageSizeQueryParameter;
|
||||
}
|
||||
}
|
@ -0,0 +1,15 @@
|
||||
package au.com.royalpay.payment.manage.management.channelreconciliationfile;
|
||||
|
||||
import com.github.miemiedev.mybatis.paginator.domain.PageList;
|
||||
|
||||
/**
|
||||
* @Description
|
||||
* @title:
|
||||
* @Date 2020/11/5 16:50
|
||||
* @author: zhangTao
|
||||
*/
|
||||
public interface ChannelReconciliationFileTunnel {
|
||||
|
||||
PageList<ChannelReconciliationFileDTO> list(ChannelReconciliationFileQueryParameter channelReconciliationFileQueryParameter);
|
||||
|
||||
}
|
@ -0,0 +1,14 @@
|
||||
package au.com.royalpay.payment.manage.management.channelreconciliationfile;
|
||||
|
||||
/**
|
||||
* @Description
|
||||
* @title:
|
||||
* @Date 2020/11/6 11:24
|
||||
* @author: zhangTao
|
||||
*/
|
||||
public class FileDownloadException extends RuntimeException {
|
||||
|
||||
public FileDownloadException() {
|
||||
super("文件下载异常");
|
||||
}
|
||||
}
|
@ -0,0 +1,14 @@
|
||||
package au.com.royalpay.payment.manage.management.channelreconciliationfile;
|
||||
|
||||
/**
|
||||
* @Description
|
||||
* @title:
|
||||
* @Date 2020/11/6 11:24
|
||||
* @author: zhangTao
|
||||
*/
|
||||
public class MultiFileChannelReconciliationException extends RuntimeException {
|
||||
|
||||
public MultiFileChannelReconciliationException() {
|
||||
super("渠道多文件异常");
|
||||
}
|
||||
}
|
@ -0,0 +1,29 @@
|
||||
package au.com.royalpay.payment.manage.management.channelreconciliationfile.common;
|
||||
|
||||
/**
|
||||
* @Description
|
||||
* @title:
|
||||
* @Date 2020/11/16 13:36
|
||||
* @author: zhangTao
|
||||
*/
|
||||
public class PageSize {
|
||||
|
||||
private int page;
|
||||
protected int rows;
|
||||
|
||||
public PageSize(int page, int rows) {
|
||||
this.page = page;
|
||||
this.rows = rows;
|
||||
}
|
||||
|
||||
public int getPage() {
|
||||
if (page == 0) {
|
||||
return 1;
|
||||
}
|
||||
return page;
|
||||
}
|
||||
|
||||
public int getRows() {
|
||||
return rows;
|
||||
}
|
||||
}
|
@ -0,0 +1,26 @@
|
||||
package au.com.royalpay.payment.manage.management.channelreconciliationfile.common;
|
||||
|
||||
/**
|
||||
* @Description
|
||||
* @title: 时间区间
|
||||
* @Date 2020/11/16 11:59
|
||||
* @author: zhangTao
|
||||
*/
|
||||
public class TimeRange {
|
||||
|
||||
private String startTime;
|
||||
private String endTime;
|
||||
|
||||
public TimeRange(String startTime, String endTime) {
|
||||
this.startTime = startTime;
|
||||
this.endTime = endTime;
|
||||
}
|
||||
|
||||
public String getStartTime() {
|
||||
return startTime;
|
||||
}
|
||||
|
||||
public String getEndTime() {
|
||||
return endTime;
|
||||
}
|
||||
}
|
@ -0,0 +1,26 @@
|
||||
package au.com.royalpay.payment.manage.management.channelreconciliationfile.common;
|
||||
|
||||
/**
|
||||
* @Description
|
||||
* @title:
|
||||
* @Date 2020/11/16 13:47
|
||||
* @author: zhangTao
|
||||
*/
|
||||
public class TimeRangeAndPageSizeQueryParameter {
|
||||
|
||||
private TimeRange timeRange;
|
||||
private PageSize pageSize;
|
||||
|
||||
public TimeRangeAndPageSizeQueryParameter(TimeRange timeRange, PageSize pageSize) {
|
||||
this.timeRange = timeRange;
|
||||
this.pageSize = pageSize;
|
||||
}
|
||||
|
||||
public TimeRange getTimeRange() {
|
||||
return timeRange;
|
||||
}
|
||||
|
||||
public PageSize getPageSize() {
|
||||
return pageSize;
|
||||
}
|
||||
}
|
@ -0,0 +1,60 @@
|
||||
package au.com.royalpay.payment.manage.management.clearing.beans;
|
||||
|
||||
import com.alibaba.fastjson.annotation.JSONField;
|
||||
|
||||
|
||||
/**
|
||||
* Create by Todking at 2020-12-28
|
||||
*/
|
||||
public class TransactionStatus {
|
||||
|
||||
@JSONField(name = "status")
|
||||
private Integer status;
|
||||
|
||||
@JSONField(name = "time")
|
||||
private String time;
|
||||
|
||||
private String statusInfo;
|
||||
|
||||
public Integer getStatus() {
|
||||
return status;
|
||||
}
|
||||
|
||||
public void setStatus(Integer status) {
|
||||
this.status = status;
|
||||
}
|
||||
|
||||
public String getTime() {
|
||||
return time;
|
||||
}
|
||||
|
||||
public void setTime(String time) {
|
||||
this.time = time;
|
||||
}
|
||||
|
||||
public String getStatusInfo() {
|
||||
return statusInfo;
|
||||
}
|
||||
|
||||
public void setStatusInfo(String statusInfo) {
|
||||
this.statusInfo = statusInfo;
|
||||
}
|
||||
|
||||
public TransactionStatus toSet() {
|
||||
TransactionStatus transactionStatus = new TransactionStatus();
|
||||
switch (status) {
|
||||
case 0:
|
||||
transactionStatus.setStatusInfo("Ready To Clear");
|
||||
break;
|
||||
case 1:
|
||||
transactionStatus.setStatusInfo("Cleared");
|
||||
break;
|
||||
case 2:
|
||||
transactionStatus.setStatusInfo("Preauthorised");
|
||||
break;
|
||||
}
|
||||
transactionStatus.setStatus(status);
|
||||
transactionStatus.setTime(time);
|
||||
return transactionStatus;
|
||||
}
|
||||
}
|
@ -0,0 +1,37 @@
|
||||
package au.com.royalpay.payment.manage.mappers.log;
|
||||
|
||||
|
||||
import au.com.royalpay.payment.manage.management.channelreconciliationfile.ChannelReconciliationFileDTO;
|
||||
import au.com.royalpay.payment.manage.management.channelreconciliationfile.ChannelReconciliationFileQueryParameter;
|
||||
import au.com.royalpay.payment.manage.management.channelreconciliationfile.ChannelReconciliationFileTunnel;
|
||||
import au.com.royalpay.payment.manage.management.channelreconciliationfile.common.PageSize;
|
||||
import au.com.royalpay.payment.manage.management.channelreconciliationfile.common.TimeRange;
|
||||
import au.com.royalpay.payment.manage.management.channelreconciliationfile.common.TimeRangeAndPageSizeQueryParameter;
|
||||
import com.github.miemiedev.mybatis.paginator.domain.PageBounds;
|
||||
import com.github.miemiedev.mybatis.paginator.domain.PageList;
|
||||
import com.yixsoft.support.mybatis.autosql.annotations.AutoMapper;
|
||||
|
||||
|
||||
/**
|
||||
* @Description
|
||||
* @title:
|
||||
* @Date 2020/11/4 14:25
|
||||
* @author: zhangTao
|
||||
*/
|
||||
@AutoMapper(tablename = "log_validation_attachment_batches", pkName = "batch_id")
|
||||
public interface ChannelReconciliationFileTunnelMapper extends ChannelReconciliationFileTunnel {
|
||||
|
||||
|
||||
PageList<ChannelReconciliationFileDTO> queryChannelReconciliationFile(String billType, String channel, String startTime, String endTime, PageBounds pagination);
|
||||
|
||||
@Override
|
||||
default PageList<ChannelReconciliationFileDTO> list(ChannelReconciliationFileQueryParameter channelReconciliationFileQueryParameter){
|
||||
TimeRangeAndPageSizeQueryParameter timeRangeAndPageSizeQueryParameter = channelReconciliationFileQueryParameter.getTimeRangeAndPageSizeQueryParameter();
|
||||
TimeRange timeRange = timeRangeAndPageSizeQueryParameter.getTimeRange();
|
||||
PageSize pageSize = timeRangeAndPageSizeQueryParameter.getPageSize();
|
||||
|
||||
String channel = channelReconciliationFileQueryParameter.getChannel();
|
||||
String billType = channelReconciliationFileQueryParameter.getBillType();
|
||||
return this.queryChannelReconciliationFile(billType,channel, timeRange.getStartTime(), timeRange.getEndTime() , new PageBounds(pageSize.getPage(), pageSize.getRows()));
|
||||
}
|
||||
}
|
@ -0,0 +1,25 @@
|
||||
<?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="au.com.royalpay.payment.manage.mappers.log.ChannelReconciliationFileTunnelMapper">
|
||||
<select id="queryChannelReconciliationFile" resultType="au.com.royalpay.payment.manage.management.channelreconciliationfile.ChannelReconciliationFileDTO">
|
||||
SELECT a.batch_id ,channel, pid,bill_date,bill_type,create_time, file_id, filename, file_type,attach_id,attach_url
|
||||
FROM `log_validation_attachment_batches` a
|
||||
LEFT JOIN `log_validation_attachment_files` b ON a.`batch_id` = b.`batch_id`
|
||||
<where>
|
||||
<if test="channel != null and channel != ''">
|
||||
and channel = #{channel}
|
||||
</if>
|
||||
<if test="startTime != null and startTime != ''">
|
||||
and date_format(`bill_date`,'%Y-%m-%d') <![CDATA[>= ]]>#{startTime,jdbcType=VARCHAR}
|
||||
</if>
|
||||
<if test="endTime != null and endTime != ''">
|
||||
and date_format(`bill_date`,'%Y-%m-%d')<![CDATA[ <= ]]> #{endTime,jdbcType=VARCHAR}
|
||||
</if>
|
||||
<if test="billType != null and billType != ''">
|
||||
and bill_type = #{billType}
|
||||
</if>
|
||||
|
||||
</where>
|
||||
ORDER BY bill_date DESC
|
||||
</select>
|
||||
</mapper>
|
After Width: | Height: | Size: 1.7 KiB |
After Width: | Height: | Size: 1.1 KiB |
After Width: | Height: | Size: 538 B |
@ -0,0 +1,25 @@
|
||||
<div class="modal-header" style="display: flex;border-bottom: none;">
|
||||
<h4>Handle</h4>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<div class="row">
|
||||
<div class="col-sm-12">
|
||||
<form novalidate name="couponForm" class="form-horizontal">
|
||||
<div class="form-group">
|
||||
<label class="control-label col-sm-3">Description</label>
|
||||
<div class="col-sm-7">
|
||||
<textarea class="form-control" ng-model="message" maxlength="2000"></textarea>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<div class="btn-group">
|
||||
<button class="btn btn-success" type="button" ng-click="confirm()">OK</button>
|
||||
</div>
|
||||
<div class="btn-group">
|
||||
<button class="btn btn-danger" type="button" ng-click="$dismiss()">Cancel</button>
|
||||
</div>
|
||||
</div>
|
Loading…
Reference in new issue